数学基础

线性代数

向量

二维向量

三维向量

向量计算

向量-加法

向量缩放-相乘

基向量

基向量

基向量(Basis Vector)是构成向量空间的最小单位,就像拼积木的“基本零件”。

基向量1

我们有一个向量:


📌 线性变换后的基向量

变换后的基向量为:

  • Transformed
  • Transformed

🔄 用变换后的基向量表示原向量

将原向量用变换后的基向量表示:

代入具体值:


🧭 几何解释

  • 绿色箭头:表示变换后的
  • 红色箭头:表示变换后的
  • 黄色箭头:表示变换后的
  • 网格线展示了整个坐标系统的变换效果

图中还包含了中文注释:

  • “变换后的 i”
  • “变换后的 j”

张成

🧭 线性变换与基向量的映射

向量缩放-相乘

在线性变换下可表示为:

矩阵

🧮 2×2矩阵与线性变换

向量缩放-相乘

这类变换可以写成矩阵与向量的乘法形式:

该过程表示向量 在新的变换基底(列向量)上的线性组合。


📊 图像说明

  • 左侧图展示了标准基 在变换后的位置,形成变换坐标系。
  • 黄色向量是线性组合后的新向量。
  • 中文翻译“2×2矩阵”强调了基础的线性代数结构。

2x2矩阵

复合矩阵

复合矩阵

复合矩阵1

矩阵乘法

矩阵乘法

三维矩阵

三维矩阵

三维矩阵1

行列式

行列式是一个从方阵计算出来的实数或复数,用来衡量该矩阵的“体积变换能力”和是否“可逆”。

设二阶矩阵:

它的行列式为:

行列式

线性方程组

线性方程组

逆矩阵

列空间

不同维度之间的转换

二维转三维

二维转三维

2 = 输入空间有两个基向量
3 = 三行代表有三个独立坐标来描述

三维转二维

三维转二维

3 = 输入空间有三个基向量
2 = 两行代表有三两个独立坐标来描述

一维

一维

点积

定义:
对于两个向量

  • 反映了两个向量方向上的相似性
  • :同向
  • :垂直
  • :反向
  • 可以用来计算投影、夹角、长度平方

点积

点积1

点积2

对偶性

对称性Ux

对称性Uy

向量投影到数轴

二维投影到数轴

二维投影到数轴1

叉积 仅适用于三维向量

定义:

对于 ,叉积结果是一个向量:

方向确定正负

方向

定向

定向

定向1

叉积

叉积1

叉积2

叉积3

线性变换

线性变换

线性变换1

必然与V和W垂直 长度与这两个向量张成的平行四边形面积相同

线性变换2

范数

范数(Norm)是数学中用来**衡量向量“有多大”**的工具,也就是向量的“长度”或“大小”的一种通用定义方式。

1. 向量的范数

任意一组向量设为 如下:

  • 向量的1范数: 向量的各个元素的绝对值之和
  • 向量的2范数: 向量的每个元素的平方和再开平方根
  • 向量的负无穷范数: 向量所有元素的绝对值中最小的
  • 向量的正无穷范数: 向量所有元素的绝对值中最大的
  • 向量的p范数: 向量元素绝对值的p次方和,然后再开P次方根

2. 矩阵的范数

对于矩阵 , 举例而说:

1
2
3
4
A = [
-1, 2, 3;
4, -6, 6;
]
  • 矩阵的1范数(列范数):矩阵的每一列上的元素绝对值先求和,再从中取个最大值
  • 矩阵的2范数: 矩阵 的最大特征值开平方根

特征值分解,特征向量

  • 特征值分解可以得到特征值与特征向量
  • 特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么

矩阵A 的特征值与其特征向量, 特征值 满足:

特征值分解是将一个矩阵分解为如下形式:

: 一个对角矩阵,每一个对角元素是一个特征值里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。 特征值分解表示矩阵的信息可以由其特征值和特征向量表示。

条件概率

联合概率与边缘概率

  • 联合概率:联合概率指类似于这样,包含多个条件,且所有条件同时成立的概率。

  • 边缘概率:边缘概率指类似于这样,仅与单个随机变量有关的概率。

  • 区别:联合概率是指在多元的概率分布中多个随机变量分别满足各自条件的概率。而边缘概率是某个事件发生的概率,而与其它事件无关。

  • 联系: 联合分布可求边缘分布,但若只知道边缘分布,无法求得联合分布。

独立性与条件独立性

8.

  • 独立性:
  • 条件独立: 再条件Z发生时, X, Y 条件独立:

期望,方差,协方差,相关系数

1. 期望

**如果相互独立,则。 **

2. 方差

如果相互独立,

3. 协方差

协方差是衡量两个遍历的总体误差。

独立变量的协方差为0。

4. 相关系数

值越接近1,说明两个变量正相关性(线性)越强。越接近-1,说明负相关性越强,当为0时,表示两个变量没有相关性


QA

1. 矩阵正定性

  • 问题:矩阵正定性的判断?

    • 矩阵中的特征值均不小于 0 , 则为半正定。
    • 矩阵中的特征值都大于 0, 则为正定。
  • Hessian矩阵正定性在梯度下降中的应用

    • 在判断优化算法的可行性时Hessian矩阵的正定性起到了很大的作用,若Hessian正定,则函数的二阶偏导恒大于0,函数的变化率处于递增状态,在牛顿法等梯度下降的方法中,Hessian矩阵的正定性可以很容易的判断函数是否可收敛到局部或全局最优解。

信息论

  • 基本思想: 一件不太可能的事情发生, 要比一件非常可能的事情发生提供更多的信息
  • 性质:
    • 非常可能发生的事情信息量较少,并且极端情况下,一定能够发生的事件应该没有信息量
    • 比较不可能发生的事件具有更大的信息量
    • 独立事件应具有增量的信息。例如,投掷的硬币两次正面朝上传递的信息量,应该是投掷一次硬币正面朝上的信息量的两倍。

信息论 Self-Information

自信息衡量一个特定事件发生所带来的信息量,定义如下:

  • 事件 ( x ) 发生的概率较大时,信息量较小(可预测)。
  • 事件 ( x ) 发生的概率较小时,信息量较大(意外)。
  • 单位:比特(bit),如果以对数底为 2;若使用自然对数,则单位为 nat。

示例

  • 一个 6 面骰子掷出 “1” 的概率为 ,则:

    说明掷出 “1” 这个结果提供了约 2.585 比特的信息量。

信息熵 Entropy

信息熵衡量整个概率分布的不确定性或平均信息量,定义为:

  • 熵高:当所有事件的概率相等(如均匀分布),不确定性最大。
  • 熵低:当某个事件的概率接近 1,而其他事件几乎不可能发生时,熵接近 0,表示信息几乎是确定的。

示例

  • 公平骰子的熵:

    说明掷一次骰子,平均每次获得 2.585 比特的信息量。

  • 非公平骰子(某些面概率较大):

    因为有些结果更确定,熵变小了。

互信息 Mutual Information MI

互信息衡量两个随机变量 之间的 信息共享量,即知道一个变量后,能减少多少对另一个变量的不确定性。定义为:

或等价地:

  • 完全独立 时,,说明它们互不影响。
  • 完全相关 时, 最大,说明一个变量完全确定了另一个变量。

示例

  • 在一个通信系统中,发送的消息 与接收的消息 之间的互信息反映了多少信息被成功传输,而没有丢失或引入噪声。

相对熵 KL散度

相对熵(Kullback-Leibler Divergence, KL 散度) 用于衡量两个概率分布 之间的 差异,表示在使用分布 代替真实分布 时,信息丢失的程度

定义

KL 散度的数学公式:

或者对于连续分布:

其中:

  • 是 **真实分布**(ground truth)
  • 是 **近似分布**(模型预测分布)
  • 衡量了在 处, 之间的差异

KL 散度的含义:
  • 如果 ,则 KL 散度为 0,即两个分布完全一致时,信息损失为 0。
  • 如果 ,则 KL 散度为正数,即 不能完美地表示 ,产生信息损失。

示例

假设真实分布 和近似分布 如下:

计算 KL 散度:

交叉熵 Cross Entropy

交叉熵 是衡量两个分布之间相似性的度量,用于计算模型预测的分布 和真实分布 之间的匹配程度。

定义

交叉熵的数学公式:

或者对于连续分布:


交叉熵的含义:

  • 交叉熵衡量的是使用 预测 的平均编码长度
  • 在机器学习中,交叉熵通常作为分类问题的损失函数,用于优化模型,使得预测概率 接近真实分布

KL 散度与交叉熵的关系

交叉熵与 KL 散度有如下关系:

其中:

  • 是 **熵(Entropy)**,表示分布 自身的不确定性,与 无关。
  • 表示由于使用 代替 产生的额外信息损失。

📌 结论

  • 交叉熵 真实分布 的自身熵 加上 KL 散度 组成。
  • 最小化交叉熵等价于最小化 KL 散度,因为 是固定的。

示例

如果

  • 真实分布的熵(Entropy)
  • 交叉熵(Cross Entropy)
  • KL 散度(Relative Entropy)

联合熵 Joint Entropy

定义

联合熵 衡量两个随机变量 同时出现 时的不确定性。

对于离散随机变量 ,联合熵的数学公式为:

其中:

  • 是联合概率分布,表示事件 共同发生的概率。

对于连续随机变量:


直观理解:

  • 联合熵衡量的是 的整体不确定性。
  • 如果 独立,则:
  • 如果 相关,则: 这表明 之间的关系减少了不确定性。

示例:

假设 分别表示投掷两颗骰子的结果:

  • 如果骰子是公平的且独立的,则:
  • 如果骰子其中一颗的结果依赖于另一颗(例如总和固定为7),则:

条件熵 Conditional Entropy

定义

条件熵 表示在已知随机变量 的情况下, 仍然存在的不确定性,即 相对于 的信息熵。

数学定义:

或者对于连续变量:

其中:

  • 是条件概率,表示在给定 的情况下, 的概率。
直观理解:
  • 条件熵衡量的是 的剩余不确定性,假设 已知。
  • 如果 完全独立,那么:
  • 如果 完全由 决定,则:
示例:

假设 是 “天气”(晴天/下雨), 是 “带伞”(是/否):

  • 如果天气完全决定是否带伞(晴天不带,雨天带),则
  • 如果有些人无论天气如何都随机决定是否带伞,则 会大于 0。

关系:联合熵、条件熵、信息熵

联合熵、条件熵和信息熵之间的关系:

或者:


直观理解:
  • 联合熵 组成的整个系统的不确定性。
  • 条件熵 是在知道 之后, 还剩下的不确定性。
  • 信息熵 自身的不确定性。

在机器学习与信息论中的应用

概念 定义 应用
信息熵 衡量单个变量的不确定性 数据压缩、特征选择
联合熵 衡量 组成的系统的不确定性 多变量建模
条件熵 在已知 的情况下, 的剩余不确定性 机器学习中的分类问题

📌 实际应用:

  • 特征选择 中,条件熵 可以衡量一个特征 对目标变量 的贡献。
  • 机器学习 中,决策树 使用 信息增益 来选择最优特征。
  • 数据压缩(如 Huffman 编码) 中,利用 联合熵和条件熵 进行高效编码。

在机器学习中的应用

  • 交叉熵用于分类问题的损失函数
    • 二分类问题(如逻辑回归、二元交叉熵)中:
    • 多分类问题(如 Softmax 交叉熵)中:
  • KL 散度用于概率分布匹配
    • 变分自编码器(VAE)GAN 训练中用于衡量两个概率分布的相似度。
    • 强化学习(RL) 中,KL 散度用于策略更新。

🚀 总结

概念 公式 作用
自信息 衡量单个事件的意外程度
信息熵 衡量整个分布的不确定性
互信息 衡量两个变量之间的相关性
KL 散度 衡量 近似 的信息损失
交叉熵 衡量 的编码效率
KL 散度与交叉熵关系 最小化交叉熵等价于最小化 KL 散度
联合熵 衡量 的整体不确定性
条件熵 衡量在 已知情况下 的不确定性
联合熵与条件熵关系 联合熵 = 信息熵 + 条件熵

大数据问题

数据流采样

在一个无限的整数数据流,如何从中等概率随机抽取 k 个整数出来? – 采样问题

K = 1 时(单个元素采样)

抽样方法

  1. 当第一个整数到达时,直接保留该整数。
  2. 当第二个整数到达时,以 的概率使用该整数替换第一个整数,以 的概率丢弃该整数。
  3. 当第 个整数到达时,以 的概率使用第 个整数替换当前选中的整数,以 的概率丢弃 个整数。

归纳法验证

1. 基础情况

时,第一个数被选中的概率为 100%,成立。

2. 假设 时成立

个数中,每一个被选中的概率为

3. 证明 时仍然成立

个数被选中的概率:

个数被选中的概率:

因此,该方法保证每个数被选中的概率相同,正确性成立。

K > 1 时(多个元素采样)

抽样方法

  1. 个整数到达时,全部保留。
  2. 个整数()到达时
    • 的概率替换当前选中的 个整数中的某一个。
    • 的概率丢弃当前整数。

归纳法验证

1. 基础情况

时,所有数都被选中,概率为 100%,成立。

2. 假设 时成立

即前 个数中,每个数被选中的概率为:

3. 证明 时仍然成立
  • 个数被选中的概率:
  • 个数被选中的概率:

因此,该方法保证了每个数被选中的概率相同,正确性成立。

基数统计

计算一个数据流中不同元素的个数?

  1. HashSet
    采用 hashet,不断加入, 最终的hashset大小就是所求答案。 缺点: 单机内存存不下

  2. bitmap
    前提: 假设已经知道不同元素的个数的上限,假设为 N
    我们可以建立一个长度为N的 bit 数组, 每个元素与 bit 数组的某一位一一对应, 该位为1,则表示此元素在集合中,为 0 表示不再集合中,最终的答案为 bitmap 中1的个数。
    缺点: bitmap 与实际情况下不同元素的个数无关,而与不同元素的个数上限有关。

  3. Linear Counting
    基本思路:

  • 选择一个哈希函数 h, 其结果服从均匀分布
  • 开一个长度为 m 的bitmap,初始化为 0
  • 数据流每来一个元素,计算哈希值并对m取模,然后将该位置置1
  • 最后,若 bitmap 中还有 u 个bit 为 0, 则不同元素的总数近似为 m的选择
    对于 bitmap 长度的选择,主要由两个因素决定:基数大小以及容许的误差。 假设基数大小大约为n, 允许误差大约为 , 则 m 需要满足如下约束:
  1. Loglog Counting
    基本思路:
  • 均匀随机化。 选择哈希函数 h 的几大条件:
  • h 应该尽可能减少冲突
  • h 的结果是几乎服从均匀分布的。
    哈希后的结果是固定长度的。
    对于每个元素,计算出哈希值,每个哈希值是等长的,长度为 L
  1. HyperLogLog Counting

频率估计

计算数据流中任意元素的出现的次数

  1. HashMap
    用 HashMap 来记录每个元素出现的次数。
    缺点: 占用内存大,单机内存无法存下这个巨大的 HashMap

  2. 数据分片 + HashMap
    假设有 n 台机器, 那么每台机器都有一个HashMap, 第 i 台处理 hash(elem) % n == i-1 的元素。
    查询时, 先计算元素在哪台机器上,然后去那台机器上的HashMap读取。

  3. Count-Min Sketch

  • 选定 d 个哈希函数, 并建立一个 d * m 的二维整数数组作为哈希表
  • 对于每个元素,分别使用 d 个hash 函数计算相应哈希值,并对 m 取余,然后在对应的位置上增1,二维数组中的每个整数称为 sketch。
  • 对于要查询的元素,取出 d 个sketch, 返回最小的哪一个。(d 个sketch 都是该元素的近似频率,返回任意一个均可)
    优点: 省内存;
    缺点:对于出现次数较少的元素,准确性很差。主要是由于 hash 冲突比较严重
  1. Count-Mean-Min Sketch
    对 Count-Min Sketch 做了改进。
  • 来了一个查询,按照 Count-Min Sketch 的正常流程,取出它的d个sketch
  • 对于每个hash函数,估算一个噪音 = 该行所有整数(除了被查询的这个元素)的平均值
  • 真正的sketch = 该行的sketch - 该行的噪音
  • 返回 d 个sketch 的中位数

Heavy Hitters

寻找数据流中出现最频繁的 k 个元素?

  1. HashMap + Heap
    用一个 HashMap存放所有元素出现的次数,用一个小根堆,容量为k,存放目前出现过的最频繁的 k 个元素:
  • 元素过来时,更新 HashMap, 并且在堆中查找该元素,如果找到,则+1并调整堆; 如果没有找到,则将该元素次数与堆顶元素比较,如果大于,则把堆顶元素替换为该元素,并调整堆。
  • 时间复杂度为, 空间复杂度为
  1. 多机 HashMap + Heap
    将数据分片, 第 i 台机器只处理 的元素
    每台机器都有一个 HashMap 和 Heap, 格子计算出 top k 元素
    将每台机器的 Heap, 通过网络汇总到一台机器上,并将多个Heap合成一个 Heap
  2. Count-Min Sketch + Heap
  3. Lossy Counting
  4. SpaceSaving

范围查询

给定一个无限的整数数据流,如何查询在某个范围内的元素出现的总次数?

  1. Array of Count-Min Sketches

成员查询 Bloom Filter

给定一个无限的数据流和一个有限集合,如何判断数据流中的元素是否在这个集合中?

布隆过滤器本质上是二进制向量 + 一系列随机映射函数, 主要用于检测某元素是否在一个集合中。

  • 优点: 空间效率和查询时间都远远超过一般的算法

布隆过滤器原理

  • 加入元素:当一个元素被加入到集合时,通过 K 个哈希函数将这个元素映射成一个位数组中的K个点,把它们置为1。
  • 检索元素:查看对应的 K 个点是否都为1 : 如果存在任意一个为 0, 被检元素一定不在; 如果都为1,则很可能存在。

布隆过滤器与Bitmap 区别

布隆过滤器使用了 k 个哈希函数,每个元素对应 k 个bit,从而降低了冲突的概率

布隆过滤器缺点

  • 存在误判:即可能要查找的元素不在容器内,但 k 个位置上都是 1
  • 删除困难:一旦删除元素,不能简单将对应 k 个位置置为 0

布隆过滤器实现

假设要存的数据量为n, 期望的误判率为 fpp,我们需要计算 Bit 数组的大小 m, hash 函数的个数 k,并选择合适的哈希函数。

  • Bit 数组大小选择:

  • 哈希函数选择:

抽样方法

分层抽样的适用范围?

分层抽样利用事先掌握的信息, 充分考虑了保持样本结构和总体结构的一致性,当总体由差异明显的几部分组成的时候,适合用分层抽样。

概率分布

分布名称 分布公式 期望 方差
伯努利分布
二项分布

伯努利分布

  • 伯努利试验: 随机试验,每次试验都只有两个结果 0 与 1, 则称为伯努利试验。

假设存在一个的观测值的数据集,假设每次观测都是独立从分布中抽取,那么可以构造关于的似然函数:

如果采用极大似然的方式来估计的值,那么,对应的极大似然函数为:

关于的导数等于 0,就得到极大似然的估计值:

二项分布

  • n重伯努利试验: 将伯努利试验独立重复进行 n 次, 称为 n 重伯努利试验。

  • n 重伯努利试验中成功的总次数 X 服从二项分布:

Beta 分布

概率论

1. 事件运算规律

  • 交换律:

  • 结合律:

  • 分配律:

2. 条件概率

3. 事件独立性

  • A,B 相互独立的充要条件为 A 与 与 B 或 相互独立。
  • 当 0 < P(A) < 1 时, A, B 相互独立 等价于 P(B|A) = P(B) 或 成立
  • n 个事件间相互独立 –> 这n个事件必两两独立; 反之不成立。

4. 五大公式

  • 加法公式:

  • 减法公式:

  • 乘法公式:

  • 全概率公式:

  • 贝叶斯公式:

5. 古典型概率

  • 定义: 在样本空间中,有有限 n 个样本点,且每个样本点的发生具有相等的可能性,则称这种有限等可能试验为古典概型。

  • 如果事件 A 由 个样本点组成,则事件 A 的概率为:

6. 几何型概率

  • 定义:当试验的样本空间是某区域(该区域可以是一维,二维或三维等), 以 表示当前样本空间 的几何度量(长度,面积,体积)等。 为有限,且试验结果出现在 中的任意区域的可能性只与该区域几何度量成正比。

  • 如果事件 A 的样本点表示的区域为 , 那么事件A的概率为:

7. n重伯努利试验

  • 伯努利试验: 随机试验,每次试验都只有两个结果 , 则称为伯努利试验。
  • n重伯努利试验: 将伯努利试验独立重复进行 n 次, 称为 n 重伯努利试验。

若每次实验中, , 那么 n 重伯努利试验中事件 A 发生 k 次的概率为:

随机变量与分布

1.离散型随机变量

2. 连续型随机变量

3. 常见分布

  • **几何分布:**n重伯努利试验中, 在第 k 次试验时才首次试验成功的概率服从几何分布。

  • 超几何分布: N 件商品中含有 M 件次品,从中任意一次取出 n 件(或从中一件接一件不放回的取n件), 令 X = 抽取的n件商品中的次品件数, 则 X 服从参数为 n, N, M 的超几何分布。

  • **泊松分布:**一段时间内电话总机接到的呼叫次数, 候车的旅客数,保险索赔的次数都服从泊松分布。

  • **均匀分布:**X 在区间 [a,b] 上服从均匀分布,则

  • 指数分布:

  • 正态分布

随机变量的数学特征

1. 数学期望

  • 离散型随机变量:

  • 连续型随机变量:

  • 性质:设 C 为常数, X, Y 为随机变量

    • 的充要条件为 **X , Y不相关。**
  • 随机变量X的函数 的数学期望:

    • X 为离散随机变量:

    • X 为连续随机变量:

  • 随机变量 (X, Y) 的函数 的数学期望:

    • (X, Y) 为离散随机变量:

    • (X,Y) 为连续随机变量:

2. 方差

  • , 但不能从反推出 C 为常数
  • 的充要条件是 X 与 Y 不相关。

3. 常见分布期望与方差

https://blog.csdn.net/Ga4ra/article/details/78935537

  • 0-1 分布:

  • 二项分布:

4. 协方差

  • 定义: 对于随机变量X ,Y , 如果 存在,则称之为 X 和 Y 的协方差:

  • 性质:

5. 相关系数

  • 定义: 对于随机变量 X 和 Y, 如果 , 则称 为 X 与 Y 的相关系数。

  • 性质:

    使

6. 独立与不相关

  • 不相关: 如果随机变量 X 与 Y 的相关系数 , 则称 X 与 Y 不相关。

  • 相互独立一定不相关,不相关不一定相互独立。

  • 对于二维正态随机变量(X,Y), X 和 Y相互独立的充要条件为

  • 对于二维正态随机变量(X,Y), X,Y相互独立与不相关等价。

知识点

1. 古典概率模型

  • 原理: 在一个样本空间 S 中, 若 S 中每个样本点发生的可能性相同,那么事件A 发生的概率 。(有限等可能试验)

  • 例子: 一个骰子掷到 1 的概率:

2. 几何概率

  • 原理: 在一个几何形状 S 中随机抽取一个点,求该点属于子形状 T 的概率。(延伸到几何度量上的有限等可能试验)

  • 例子: 在一个边长为 2 的正方形内抽取一个点, 求该点属于其内切单位圆的概率。

3. 数学期望

  • 原理:一个离散随机变量X的数学期望为

  • 举例:以1/2 的概率取1, 以 1/2 的概率取 0,则此时的期望为

4. 贝叶斯

  • 条件概率:

贝叶斯定理

1. 基本概率

  • :边缘概率
  • :联合概率
  • :条件概率

2. 两大规则

  • 加和规则(sum rule):

  • 乘积规则(product rule):

  • 贝叶斯定理:

3. 实例说明

QA

1. 简单古典概率

有n个不同的球,每次抽取1个球:

  • 有放回的抽取,抽取 m 个排成一列,求不同排列总数。
  • 无放回的抽取,抽取 m 个排成一列,求不同排列总数。
  • 无放回的抽取,抽取m个忽视次序的组成一组,求不停组合总数。
  • 将所有球分为 k 个不同的组,忽视每一组中元素的次序,且每组恰好有 个球 , 求不同分组结果数。

2. 纸牌问题

  • 问题:54 张牌,分成 6 份, 每份 9 张牌, 大小王在一起的概率?(阿里一面)

  • 答案:

    • 分母: 总样本空间为将54张牌放入 1-54 的方法总数:
    • 分子: 大小王属于 1-9 的方法总数为 , 因此大小王在一起的方法总数为
    • 概率为:

3. 棍子问题

  • 问题:一根棍子折三段能组成三角形的概率?

  • 解答:

    • 假设:棍子长度为1,第一段长度为, 第二段长度为 , 第三段长度

    • 分母:总样本空间为: 1 * 1 = 1

    • 分子:两边之和大于第三边

化简画图最终得到子空间面积为

4. 采样问题

  • 问题:从 1,2,…, n 中有放回的均匀采样 m次,问出现过的不同数字的个数 x 的期望为多少?

出现的不同数字的个数 X 可以表示为 , 其中 表示 i 是否出现,如果出现, 为1,否则为 0

i 没有在 m 次采样中出现过的概率为: ,那么,有:

那么期望可加:

5. 贝叶斯

  • 问题:某城市发生一起汽车撞人逃跑事件,该城市只有两种颜色的车,蓝20%绿80%, 事发时现场只有一个目击者,他指正是蓝车,但根据专家分析,当时那种条件下能看正确的可能性是80%,那么肇事的车是蓝车的概率是多少?

假设事件 A 为目击者指正蓝车, 事件B为肇事车为蓝车,事件C为肇事车为绿车,那么有:

6. 假期期望

  • 问题:某公司有这么一个规定: 只要有1个员工过生日,当天所有员工全部放假一天。但在其余时候,所有员工都没有假期,必须正常上班。这个公司需要雇佣多少员工,才能让公司一年内所有员工的总工作期望值最大?

假设有 n 名员工, X表示不放假的天数,则总工作时间为 nX; 假设第 i 天不放假则 , 第 i 天放假则 , 那么则有:

时关于 n 增加, 时,关于n减少。

7. 下雨概率

  • 问题:你有三位好友,他们都在西雅图工作,西雅图是出了名的爱下雨,每天下雨的概率高达 2/3。 假设你的好心能够以 1/3 的概率正确判断是否在下雨。 加入他们中恰好有两位告诉你今天西雅图在下雨,问实际上下雨的概率是多少?

8. 见面概率

9. 为何推荐使用高斯分布?

当我们由于缺乏关于某个实数上分布的先验知识而不知道该选择怎样的形式时,正态分布是默认的比较好的选择,其中有两个原因:

  1. 我们想要建模的很多分布的真实情况是比较接近正态分布的。

    中心极限定理说明很多独立随机变量的和近似服从正态分布。这意味着在实际中,很多复杂系统都可以被成功地建模成正态分布的噪声,即使系统可以被分解成一些更结构化的部分。

  2. 第二,在具有相同方差的所有可能的概率分布中,正态分布在实数上具有最大的不确定性。因此,我们可以认为正态分布是对模型加入的先验知识量最少的分布。

10. 玫瑰花

  • 问题:一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略及其概率?

11. 切比雪夫不等式

切比雪夫不等式 描述了这样一个事实,事件大多会集中在平均值附近。

12. 0~1均匀分布的随机器如何变化成均值为0,方差为1的随机器

[0, 1] 均匀分布的随机器的均值为 1/2, 方差为 1/12., 那么变换为:

13. 红蓝球

  • 问题:抽蓝球红球,蓝结束红放回继续,平均结束游戏抽取次数

设抽到 蓝球 的概率为 , 设抽到红球的概率为 , 那么抽取到的次数为:

那么就有:

我们令:

那么有:

那么我们就可以得到:

当 n 趋向于无穷大时次数等于:

高斯分布

高等数学

欧拉公式

自然语言处理(NLP)

Natural Language Processing (NLP) - 自然语言处理
旨在让计算机理解、生成和处理人类语言。它涵盖了从文本分析到语音识别的广泛领域。

mindmap
  root((人工智能 AI))
    NLP
      词向量
      句法分析
      语义分析
      预训练语言模型
        BERT
        GPT
        T5

    数学基础
      随机变量
      线性代数
      概率论
      信息论
      优化方法
    
    机器学习
      监督学习
      无监督学习
      强化学习
      经典算法
        回归
        决策树
        支持向量机
        KNN
        聚类方法
    
    深度学习
      计算机视觉
      自然语言处理
      生成模型
      预训练模型
      训练技巧
      框架
        TensorFlow
        PyTorch
    
    神经网络
      感知机
      多层感知机(MLP)
      卷积神经网络(CNN)
      递归神经网络(RNN)
      Transformer

深度学习模型

神经网络:

  • RNNs (Recurrent Neural Networks) - 循环神经网络
    适用于序列数据,如文本。它通过隐藏状态捕捉上下文信息,但存在梯度消失问题
  • LSTMs (Long Short-Term Memory networks) - 长短期记忆网络
    RNN的改进版本,通过门控机制解决梯度消失问题,适用于长序列数据
  • CNN - 卷积神经网络
  • MLP

统计自然语言处理

深度学习自然语言处理

  • 文本数据预处理
  • 各大任务的评价指标
  • 改进 NLP 模型的一些思路

词向量三部曲

  • 词向量 - Word2Vec
  • 词向量 - Glove
  • 词向量 - FastText

预训练语言模型

预训练模型:

  • BERT
  • GPT
  • Transformer通过自注意力机制(Self-Attention)捕捉全局依赖关系,无需序列处理。BERT和GPT都是基于Transformer的模型

预训练语言模型 - BERT改进研究
预训练语言模型 - 融入知识图谱
预训练语言模型 - 自然语言生成

Attention 机制

框架和工具:

  • TensorFlow
  • PyTorch
  • Keras
  • Hugging Face

数据处理和特征工程

  • 文本预处理:熟悉常见的文本预处理步骤,如分词、去停用词、词干提取和词形还原。
  • 特征提取:掌握 TF-IDF、word2vec、GloVe 等常用的文本表示方法,了解最新的嵌入技术。
  • 数据清洗和增强:能够处理缺失数据、异常值,以及数据增强技术的应用,如同义词替换、回译等。

GRUs (Gated Recurrent Units)

语料表

attention(权重)
元素-向量

attention 序列模型机制

在传统的Encoder-Decoder框架中,Decoder仅仅基于Encoder的最终输出来生成目标语言单词,这样就可能会忽略一些重要的信息,导致翻译效果不佳。为了解决这个问题,Attention机制被引入到Encoder-Decoder框架中,使得Decoder可以根据源语言句子的不同部分赋予不同的权重,从而更加关注重要的信息。

  1. 计算注意力权重:对于每个目标语言单词,通过计算该单词与源语言句子中每个单词的相似度,来确定每个源语言单词对目标语言单词的贡献程度。这个相似度通常使用点积或者余弦相似度进行计算。
  2. 加权求和:对于每个目标语言单词,根据注意力权重对源语言单词的向量进行加权求和,得到一个加权向量表示。
  3. 上下文向量:将加权向量表示与Decoder的上一个隐状态进行拼接,得到上下文向量。上下文向量包含了源语言句子中与当前目标语言单词相关的信息,可以帮助Decoder更好地生成目标语言单词。

example
I am pig

  1. 准备放入数据(向量)[decoderA-编码器] -> [i] [am] [pig] + [decoderA] 变成机器可以识别的特征码
  2. 给每个向量一个得分(分数) -> [i] * [decoderA] = [i-score] = 13, [am] * [decoderA] = [am-score] = 9, [pig] * [decoderA] = [pig-score] = 10
  3. 给每个得分一个权重 -> [i-score] * [权重] = 0.96, [am-score] * [权重] = 0.02, [pig-score] * [权重] = 0.12
  4. 重新算得一个平均值 -> 13 * 0.96 = [new-i-score], 9 * 0.02 = [new-am-score], 10 * 0.12 = [new-pig-score]
  5. 合并数值并且[decoderB-解码器] -> [new-i-score] [new-am-score] [new-pig-score] + [decoderB]

LAS模型

NLP(自然语言处理)算法 最全面面试题
100 个 NLP 面试问题
NLP 自然语言处理 面试题汇总
一文读懂机器学习分类算法

深度学习

深度学习

深度学习、神经网络、机器学习、人工智能的关系

深度学习、机器学习、人工智能

简单来说:

  • 深度学习是机器学习的一个分支(最重要的分支)
  • 机器学习是人工智能的一个分支

深度学习、神经网络

深度学习的概念源于人工神经网络的研究,但是并不完全等于传统神经网络。

不过在叫法上,很多深度学习算法中都会包含”神经网络”这个词,比如:卷积神经网络、循环神经网络。

所以,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。

案例:别图片中的汉字

假设深度学习要处理的信息是“水流”,而处理数据的深度学习网络是一个由管道和阀门组成的巨大水管网络。网络的入口是若干管道开口,网络的出口也是若干管道开口。这个水管网络有许多层,每一层由许多个可以控制水流流向与流量的调节阀。根据不同任务的需要,水管网络的层数、每层的调节阀数量可以有不同的变化组合。对复杂任务来说,调节阀的总数可以成千上万甚至更多。水管网络中,每一层的每个调节阀都通过水管与下一层的所有调节阀连接起来,组成一个从前到后,逐层完全连通的水流系统。

图片转化为计算机能看懂的语言

那么,计算机该如何使用这个庞大的水管网络来学习识字呢?

比如,当计算机看到一张写有“田”字的图片,就简单将组成这张图片的所有数字(在计算机里,图片的每个颜色点都是用“0”和“1”组成的数字来表示的)全都变成信息的水流,从入口灌进水管网络。

识别“田”字

我们预先在水管网络的每个出口都插一块字牌,对应于每一个我们想让计算机认识的汉字。这时,因为输入的是“田”这个汉字,等水流流过整个水管网络,计算机就会跑到管道出口位置去看一看,是不是标记由“田”字的管道出口流出来的水流最多。如果是这样,就说明这个管道网络符合要求。如果不是这样,就调节水管网络里的每一个流量调节阀,让“田”字出口“流出”的水最多。

这下,计算机要忙一阵了,要调节那么多阀门!好在计算机的速度快,暴力的计算加上算法的优化,总是可以很快给出一个解决方案,调好所有阀门,让出口处的流量符合要求。

识别“申”字

下一步,学习“申”字时,我们就用类似的方法,把每一张写有“申”字的图片变成一大堆数字组成的水流,灌进水管网络,看一看,是不是写有“申”字的那个管道出口流水最多,如果不是,我们还得再调整所有的阀门。这一次,要既保证刚才学过的“田”字不受影响,也要保证新的“申”字可以被正确处理。

如此反复进行,知道所有汉字对应的水流都可以按照期望的方式流过整个水管网络。这时,我们就说,这个水管网络是一个训练好的深度学习模型了。当大量汉字被这个管道网络处理,所有阀门都调节到位后,整套水管网络就可以用来识别汉字了。这时,我们可以把调节好的所有阀门都“焊死”,静候新的水流到来。

一行字里面识别“田”和”申“

与训练时做的事情类似,未知的图片会被计算机转变成数据的水流,灌入训练好的水管网络。这时,计算机只要观察一下,哪个出水口流出来的水流最多,这张图片写的就是哪个字。

深度学习大致就是这么一个用人类的数学知识与计算机算法构建起来的整体架构,再结合尽可能多的训练数据以及计算机的大规模运算能力去调节内部参数,尽可能逼近问题目标的半理论、半经验的建模方式。

传统机器学习 VS 深度学习

传统机器学习和深度学习的相似点

在数据准备和预处理方面,两者是很相似的。

他们都可能对数据进行一些操作:

  • 数据清洗
  • 数据标签
  • 归一化
  • 去噪
  • 降维

传统机器学习和深度学习的核心区别

传统机器学习的特征提取主要依赖人工,针对特定简单任务的时候人工提取特征会简单有效,但是并不能通用。

深度学习的特征提取并不依靠人工,而是机器自动提取的。这也是为什么大家都说深度学习的可解释性很差,因为有时候深度学习虽然能有好的表现,但是我们并不知道他的原理是什么。

深度学习的优缺点

  • 优点

    1. 学习能力强
      从结果来看,深度学习的表现非常好,他的学习能力非常强。

    2. 覆盖范围广,适应性好
      深度学习的神经网络层数很多,宽度很广,理论上可以映射到任意函数,所以能解决很复杂的问题。

    3. 数据驱动,上限高
      深度学习高度依赖数据,数据量越大,他的表现就越好。在图像识别、面部识别、NLP 等部分任务甚至已经超过了人类的表现。同时还可以通过调参进一步提高他的上限。

    4. 可移植性好
      由于深度学习的优异表现,有很多框架可以使用,例如 TensorFlow、Pytorch。这些框架可以兼容很多平台。

  • 缺点

    1. 计算量大,便携性差
      深度学习需要大量的数据很大量的算力,所以成本很高。并且现在很多应用还不适合在移动设备上使用。目前已经有很多公司和团队在研发针对便携设备的芯片。这个问题未来会得到解决。

    2. 硬件需求高
      深度学习对算力要求很高,普通的 CPU 已经无法满足深度学习的要求。主流的算力都是使用 GPU 和 TPU,所以对于硬件的要求很高,成本也很高。

    3. 模型设计复杂
      深度学习的模型设计非常复杂,需要投入大量的人力物力和时间来开发新的算法和模型。大部分人只能使用现成的模型。

    4. 没有”人性”,容易存在偏见
      由于深度学习依赖数据,并且可解释性不高。在训练数据不平衡的情况下会出现性别歧视、种族歧视等问题。

几个典型的深度学习算法

卷积神经网络 CNN

CNN 的价值:

  • 能够将大数据量的图片有效的降维成小数据量(并不影响结果)
  • 能够保留图片的特征,类似人类的视觉原理

CNN 的基本原理:

  • 卷积层 – 主要作用是保留图片的特征
  • 池化层 – 主要作用是把数据降维,可以有效的避免过拟合
  • 全连接层 – 根据不同任务输出我们想要的结果

CNN 的实际应用:

  • 图片分类、检索
  • 目标定位检测
  • 目标分割
  • 人脸识别
  • 骨骼识别

循环神经网络 – RNN

RNN 是一种能有效的处理序列数据的算法。比如:文章内容、语音音频、股票价格走势…

之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。

于是基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:

  • 长期信息可以有效的保留
  • 挑选重要信息保留,不重要的信息会选择“遗忘”

RNN 几个典型的应用如下:

  • 文本生成
  • 语音识别
  • 机器翻译
  • 生成图像描述
  • 视频标记

生成对抗网络 – GANs

假设一个城市治安混乱,很快,这个城市里就会出现无数的小偷。在这些小偷中,有的可能是盗窃高手,有的可能毫无技术可言。假如这个城市开始整饬其治安,突然开展一场打击犯罪的「运动」,警察们开始恢复城市中的巡逻,很快,一批「学艺不精」的小偷就被捉住了。之所以捉住的是那些没有技术含量的小偷,是因为警察们的技术也不行了,在捉住一批低端小偷后,城市的治安水平变得怎样倒还不好说,但很明显,城市里小偷们的平均水平已经大大提高了。

警察们开始继续训练自己的破案技术,开始抓住那些越来越狡猾的小偷。随着这些职业惯犯们的落网,警察们也练就了特别的本事,他们能很快能从一群人中发现可疑人员,于是上前盘查,并最终逮捕嫌犯;小偷们的日子也不好过了,因为警察们的水平大大提高,如果还想以前那样表现得鬼鬼祟祟,那么很快就会被警察捉住。为了避免被捕,小偷们努力表现得不那么「可疑」,而魔高一尺、道高一丈,警察也在不断提高自己的水平,争取将小偷和无辜的普通群众区分开。随着警察和小偷之间的这种「交流」与「切磋」,小偷们都变得非常谨慎,他们有着极高的偷窃技巧,表现得跟普通群众一模一样,而警察们都练就了「火眼金睛」,一旦发现可疑人员,就能马上发现并及时控制——最终,我们同时得到了最强的小偷和最强的警察。

深度强化学习 – RL

强化学习算法的思路非常简单,以游戏为例,如果在游戏中采取某种策略可以取得较高的得分,那么就进一步「强化」这种策略,以期继续取得较好的结果。这种策略与日常生活中的各种「绩效奖励」非常类似。我们平时也常常用这样的策略来提高自己的游戏水平。

总结

深度学习属于机器学习的范畴,深度学习可以说是在传统神经网络基础上的升级,约等于神经网络。

深度学习和传统机器学习在数据预处理上都是类似的。核心差别在特征提取环节,深度学习由机器自己完成特征提取,不需要人工提取。

深度学习的优点:

  • 学习能力强
  • 覆盖范围广,适应性好
  • 数据驱动,上限高
  • 可移植性好

深度学习的缺点:

  • 计算量大,便携性差
  • 硬件需求高
  • 模型设计复杂
  • 没有”人性”,容易存在偏见

在 Flappy bird 这个游戏中,我们需要简单的点击操作来控制小鸟,躲过各种水管,飞的越远越好,因为飞的越远就能获得更高的积分奖励。

这就是一个典型的强化学习场景:

  • 机器有一个明确的小鸟角色——代理
  • 需要控制小鸟飞的更远——目标
  • 整个游戏过程中需要躲避各种水管——环境
  • 躲避水管的方法是让小鸟用力飞一下——行动
  • 飞的越远,就会获得越多的积分——奖励

深度学习流程

1. 定义问题

确定是分类问题还是回归问题,还是无监督问题。

2. 探索和清洗数据

探索和进一步清洗数据集一直都是深度学习中最重要的一步。

3. 选择模型并探索模型结果

探索模型的结果,通常是需要对模型在验证集上的性能进行进一步的分析,这是如何进一步提升模型性能很重要的步骤。将模型在训练集和验证集都进行结果的验证和可视化,可直观的分析出模型是否存在较大偏差以及结果的正确性。

4. 监控训练和验证误差

首先很多情况下,我们忽略代码的规范性和算法撰写正确性验证,这点上容易产生致命的影响。

在训练和验证都存在问题时,首先请确认自己的代码是否正确。其次,根据训练和验证误差进一步追踪模型的拟合状态。若训练数据集很小,此时监控误差则显得格外重要。确定了模型的拟合状态对进一步调整学习率的策略的选择或者其他有效超参数的选择则会更得心应手。


模型提升策略

1. 数据角度

数据增强。 扩充数据集。

2. 模型角度

提高模型复杂度,更改模型结构。

3. 调参角度

4. 训练角度

深度学习脑图

flowchart LR
    A[深度学习]
    
    A --> B[Tirck]

    A --> C[卷积神经网络(CNN)]

    A --> D[循环神经网络(RNN)]

    A --> E[人工神经网络(ANN)]

Trick Dropout

  • 思想: 在每次训练过程中随机地忽略一些神经元。这些神经元被随机地“抛弃”了。也就是说它们在正向传播过程中对于下游神经元的贡献效果暂时消失了,反向传播时该神经元也不会有任何权重的更新。

  • **注意:**每次迭代的过程中,我们删除的神经单元是随机的,本次删除的与上次删除神经元是不一样的

简单来说,Dropout 通过参数共享提供了一种廉价的 Bagging 集成近似—— Dropout 策略相当于集成了包括所有从基础网络除去部分单元后形成的子网络。

QA

1. 为何 Dropout 能够解决过拟合?

  • 取平均的作用: 先回到正常的模型(没有dropout),我们用相同的训练数据去训练5个不同的神经网络,一般会得到5个不同的结果,此时我们可以采用 “5个结果取均值”或者“多数取胜的投票策略”去决定最终结果。这种“综合起来取平均”的策略通常可以有效防止过拟合问题。因为不同的网络可能产生不同的过拟合,取平均则有可能让一些“相反的”拟合互相抵消。

    dropout 掉不同的隐藏神经元就类似在训练不同的网络(随机删掉一半隐藏神经元导致网络结构已经不同),整个dropout过程就相当于 对很多个不同的神经网络取平均。而不同的网络产生不同的过拟合,一些互为“反向”的拟合相互抵消就可以达到整体上减少过拟合。

  • 减少神经元之间复杂的共适应关系: 因为dropout程序导致两个神经元不一定每次都在一个dropout网络中出现。(这样权值的更新不再依赖于有固定关系的隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况)。 迫使网络去学习更加鲁棒的特征 (这些特征在其它的神经元的随机子集中也存在)。

    换句话说假如我们的神经网络是在做出某种预测,它不应该对一些特定的线索片段太过敏感,即使丢失特定的线索,它也应该可以从众多其它线索中学习一些共同的模式(鲁棒性)。(这个角度看 dropout就有点像L1,L2正则,减少权重使得网络对丢失特定神经元连接的鲁棒性提高)

2. Drpout 与 Bagging 有何不同?

  • 在 Bagging 的情况下,所有模型都是独立的;而在 Dropout 的情况下,所有模型共享参数,其中每个模型继承父神经网络参数的不同子集。
  • 在 Bagging 的情况下,每一个模型都会在其相应训练集上训练到收敛。而在 Dropout 的情况下,通常大部分模型都没有显式地被训练;取而代之的是,在单个步骤中我们训练一小部分的子网络,参数共享会使得剩余的子网络也能有好的参数设定。

3. Dropout 有什么缺陷?

dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。

我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。我觉得你也可以尝试其它方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与dropout方法一起使用。

Trick Normalization

归一化

1. 归一化手段

  • **Min-max 归一化:**当有新数据加入时, 可能导致max和min的变化, 需要重新定义。

  • **Zero-mean 归一化:**均值为0,标准差为1的标准正态分布。 z-score标准化方法适用于属性A的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。该种标准化方式要求原始数据的分布可以近似为高斯分布,否则效果会变得很糟糕。

2. Min-max 与 Zero-mean 区别

  • 对于输出结果范围有要求, 使用Min-max normalization
  • 数据较为稳定, 不存在极端最大值,最小值, 用归一化
  • 如果数据存在异常值或较多噪音, 使用标准化。

3. 为何归一化为何如此优秀?

归一化的本质就是线性变换。 线性变化的诸多良好性质,决定了为什么对数据进行改变后不会造成“失效”,还能提高数据的表现。

归一化加快了梯度下降求最优解的速度。

假定一个预测房价的例子,两个特征: 面积与房间数,那么则有: 表房间数, 表面积 , 现实中,面积范围往往在 , 而房间通常为 , 那么面积对模型的影响要更大一些,此时寻求最优解的过程为:

1

归一化后,寻求最优解的过程为:

在未归一化的时候, 由于 的更新幅度要比 小, 因此 的应该要比 要大,但是在实际中,我们使用常规梯度下降法时,我们各个的学习率都是一样的,这也就造成了 的更新会比较慢,结果就是寻求最优解的过程会走很多弯路导致模型收敛速度缓慢。

我们来实际举例, 假设在未归一化的时候, 我们的损失函数为:

那么经过归一化后,我们的损失函数可能就变为:

很明显可以看到,数据归一化后, 最优解的寻找过程会很平缓,更容易正确收敛到最优解。

其次,还有一些博客中提到,归一化有可能提高精度, 这在涉及到一些距离计算的算法时效果显著。

Batch Normalization

假设一个 batch 为 m 个输入 , BN 在这 m 个数据之间做 Normalization, 并学习参数

Layer Normalization

LN 不同于 BN, 其在层内进行 Normalization, 即直接对隐层单元的输出做 Normalization。最大的好处是不再依赖 batch size。

  • H: 某层中的隐层单元数

Weight Normalization

QA

1. 什么是 ICS?

ICS 指的是在训练过程中由于网络参数的变化而导致各层网络的输入分布发生了变化, 而深层网络通过层层叠加,高层的输入分布变化会非常剧烈,这就需要高层不断去重新适应底层的参数更新。而为了训好模型,我们需要非常谨慎的去设定学习率, 初始化权重等。

从数学角度来看,它指的是源空间与目标空间的条件概率是一致的,但是其边缘概率不同。 即对所有 , 但是

其实,通俗理解来说,就是对于神经网络的各层输出,由于经过了一系列的隐层操作,其分布显然与各层对应的输入数据分布不同,且这种差距会随着网络深度的增加而加大。而在训练过程中, 网络参数的变化会使得各层网络的输入分布发生变化,越深的网络,变化可能越大。

2. ICS 会导致什么问题?

  • 上层参数需要不断适应新的输入数据分布,降低学习速度
  • 下层输入的变化可能趋向于变大或变小,导致上层落入饱和区,使得学习过早停止。
  • 每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。

3. BN 到底解决了什么问题?

  • 解释1: 原论文说 BN 解决了 ICS 问题,但后续有论文推翻了这个结论,参见:《How Does Batch Normalization Help Optimization》

  • 解释2: 为了防止梯度消失,这也很好理解, BN 将激活函数的输入数据压缩在 N(0,1) 空间内,的确能够很大程度上减轻梯度消失问题。

  • 解释3: 来源于《How Does Batch Normalization Help Optimization》 , BN 使得优化空间更加平滑,具体来说,BN实际上是改变了损失函数的 lipschitz 性质, 使得梯度的改变变得很轻微,这使得我们可以采用更大的步长且仍然能够保持对实际梯度方向的精确估计。

    通俗来讲, 不进行BN, 损失函数不仅仅非凸且趋向于坑洼,平坦区域和极小值,这使得优化算法极不稳定,使得模型对学习率的选择和初始化方式极为敏感,而BN大大减少了这几种情况发生。

我个人更倾向于第三种解释。

4. BN 的优点与缺点

  • BN 的优点:

    • 加速网络训练(缓解梯度消失,支持更大的学习率)
    • 抑制过拟合
    • 降低了参数初始化的要求。
  • BN 的缺点:

    • 对 batch size的要求较高。这是因为如果 batch size 过小,无法估计出全局的样本分布
    • **训练和预测时有些差别。**训练时一个 batch 之间进行 Normalization, 预测时需要依靠训练时获得的 均值和方差来进行预测。

5. 为何训练时不采用移动平均?

参见: 《Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models》

  • 使用 BN 的目的就是为了保证每批数据的分布稳定,使用全局统计量反而违背了这个初衷;
  • BN 的作者认为在训练时采用移动平均可能会与梯度优化存在冲突;

6. BN 与 LN 的区别是什么?

LN 对层进行 Normalization , BN 对 batch 进行 Normalization。 LN 摆脱了对 batch size 的依赖, 在 NLP 领域,使用极为广泛, 基本不用 BN。

我个人的认为是, BN 是对batch进行操作,然而, 语言的复杂度使得 一个 batch 的数据对于全局的数据分布估计极为不准,这使得 BN 的效果变得很差。

7. 什么时候使用 BN 或 LN?

  • 一般只在深层网络中使用, 比如在深层的 Transformer 中, LN 就起到了很关键的作用。
  • BN 与 LN 应用在非线性映射前效果更佳。
  • 当你发现你的网络训练速度慢,梯度消失,爆炸等问题时, 不妨考虑加入 BN 或 LN 来试试。
  • 使用 BN 时, 对 batch size 要求较高, 且在训练前需要对数据进行 shuffle。

8. BN 在何处做?

BN 可以对第 L 层激活函数输出值对第 L层激活函数的输入值进行 Normalization, 对于两个不同的位置,不少研究已经表明:放在第 L 层激活函数输出值会更好

9. 为什么要归一化?

  • 归一化的确可以避免一些不必要的数值问题。
  • 为了程序运行时收敛加快。
  • 统一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
  • 避免神经元饱和。啥意思?就是当神经元的激活在接近 0 或者 1 时会饱和,在这些区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死”梯度。
  • 保证输出数据中数值小的不被吞食。

Reference

[1] Batch Normalization

[2] Layer Normalization

[3] How Does Batch Normalization Help Optimization

[4] Batch Renormalization: Towards Reducing Minibatch Dependence in Batch-Normalized Models

深度学习中 Batch Normalization为什么效果好? - 知乎

深度学习中的Normalization模型

Trick 学习率衰减

为什么要进行学习率衰减?

随着训练的加深,当模型训练到一定程度后,损失将不再减少,这个时候模型的一阶梯度接近于0, 对应的 Hessian 矩阵通常是两种情况:

  • 正定,即所有特征值均为正,此时通常可以得到一个局部极小值,若这个局部极小值接近全局最小则模型已经能得到不错 的性能了,但若差距很大,则模型性能还有待于提升,通常情况下后者在训练初最常见。
  • 特征值有正有负,此时模型很可能陷入了鞍点,若陷入鞍点,模型性能表现就很差。

以上两种情况在训练初期以及中期,此时若仍然以固定的学习率,会使模型陷入左右来回的震荡或者鞍点,无法继续优化。所以,学习率衰减或者增大能帮助模型有效的减少震荡或者逃离鞍点。

学习率衰减策略

参见 500 questions 第14 章

Trick 提前终止


前期对该Trick的重视度不够, 想着,不就是过拟合吗? 我只要保存 验证集 loss 最低点的模型, 你过拟合管我什么事情, 然而, 上了 Bert + 中大规模数据集之后, 我才发现什么叫做噩梦 – 训练时间太 bb 长了吧。

那还能咋地, 你总不能把 epoch 数量设置的太小吧, 10 是比较基本的吧(看数据集),但这样跑也能跑个一天一夜,枯了。 这个时候这个Trick 就很有用了,大大节省模型训练时间。

提前终止指的是当验证集的误差连续 n次递增时停止训练。 一般情况下, 我会先将n设置为一个较大的数, 跑一个较大的 epoch(如20), 然后根据 loss 曲线来选择合适的 epoch 数量和 n, 接下来就欢快的嘿嘿嘿了。

需要注意的是,提前终止有其他很多策略,上面提到的只是很常用的一种,至于什么时候选择什么样的提前终止策略也是一个经验活, 还好, [1] 中为我们提供了一些参考, 值得一看。 由于本人经验时间优先,没有深入探讨,希望有大佬帮忙解惑。下面我简单提一下[1] 中是如何建议的。

Early Stop, but when? [1]

首先,思考一个问题: 如果我们以验证集loss最小值来作为保存模型的依据,那么这会不会对模型的泛化能力产生影响?我个人认为是不会,具体需要看Loss曲线图。一般而言,第一次跑的时候,我往往会设置一个很大的 epoch, 这样能够直观的从Loss曲线上看到很多信息,从而帮助我来选择更佳合适 epoch数量, 我个人一般取开始过拟合之后两个epoch作为epoch的最终数量。

我自己做实验发现,在验证集loss最低点不一定能够获得在测试集上最好的效果,有时候,最低点附近的一些点反而在测试集上表现更佳,但差别不大,这也是我认为不会影响模型泛化能力的一个依据, 而实际落地中,这点差别其实真的没有啥鸟用。

回到Trick, 文章谈到, 何时提前停止是对训练时间和泛化误差之间的权衡, 而如果我采用在验证集loss最低点存储模型的方式,那么何时提前停止就不再是对泛化误差的权衡了, 其变成了,如何选择何种的策略来对训练时间以及获取验证集loss全局最低点来做权衡,使得我们能够找到该点并保存模型,而不至于陷入一些困境[2]。

最后谈谈 Early Stop 策略, 选择合适的策略能够使得我们在合适的时间终止整个训练,从而节省时间。

Trick 正则化

https://blog.csdn.net/jinping_shi/article/details/52433975

https://zhuanlan.zhihu.com/p/38709373

https://blog.csdn.net/heyongluoyao8/article/details/49429629

1. L1 正则化 - 稀疏正则化

1-范数: 表示向量元素的绝对值之和。

不同于L2,L1 正则化使得权重值可能被减少到0。 因此,L1对于压缩模型很有用。

稀疏向量通常会有许多维度,如果再加上使用特征组合会导致包含更多的维度的。由于使用此类高维度特征向量,因此模型可能会非常庞大,并且需要大量的 RAM。

在高维度稀疏矢量中,最好尽可能使权重正好降至 0。正好为 0 的权重基本上会使相应特征从模型中移除。 将特征设为 0 可节省 RAM 空间,且可以减少模型中的噪点。

2. L2 正则化 – 权重衰减

2-范数: 表示向量元素绝对值的平方和再开方。

L2正则化又称权重衰减。因为其导致权重趋向于0(但不全是0)。

执行 L2 正则化对模型具有以下影响:

  • 使权重值接近于 0(但并非正好为 0)
  • 使权重的平均值接近于 0,且呈正态分布。

QA

1. 为何只对权重进行正则惩罚,而不针对偏置

在神经网络中,参数包括每一层仿射变换的权重偏置,我们通常只对权重做惩罚而不对偏置做正则惩罚。

精确拟合偏置所需的数据通常比拟合权重少得多。每个权重会指定两个变量如何相互作用。我们需要在各种条件下观察这两个变量才能良好地拟合权重。而每个偏置仅控制一个单变量。这意味着,我们不对其进行正则化也不会导致太大的方差。另外,正则化偏置参数可能会导致明显的欠拟合。

2. 权重衰减的目的

限制模型的学习能力,通过限制参数 θ 的规模(主要是权重 w 的规模,偏置 b 不参与惩罚),使模型偏好于权值较小的目标函数,防止过拟合。

3. L1 与 L2 的异同

  • 相同点:限制模型的学习能力,通过限制参数的规模,使模型偏好于权值较小的目标函数,防止过拟合。

  • 不同点:

    • L1是模型各个参数的绝对值之和;L2为各个参数平方和的开方值。
    • L1 正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择;L2 会趋向于生成一个参数值很小的矩阵。
    • L1 适用于特征之间有关联的情况; L2 适用于特征之间没有关联的情况

4.为什么 L1 正则化 可以产生稀疏值,而 L2 不会?

添加 L1 正则化,相当于在 L1范数的约束下求目标函数 J 的最小值,下图展示了二维的情况:

L1

图中 J 与 L 首次相交的点就是最优解。L1 在和每个坐标轴相交的地方都会有“角”出现(多维的情况下,这些角会更多),在角的位置就会产生稀疏的解。而 J 与这些“角”相交的机会远大于其他点,因此 L1 正则化会产生稀疏的权值。

对于 L2 正则化来说,其二维平面下的图形为:

L2

如上图所示, 相比于 L1 正则化, L2 不会产生 “角”, 因此 J 与 L2 相交的点具有稀疏性的概率就会变得非常小。

5. 为何 L1 和 L2 正则化可以防止过拟合?

L1 & L2 正则化会使模型偏好于更小的权值。

简单来说,更小的权值意味着更低的模型复杂度,也就是对训练数据的拟合刚刚好,不会过分拟合训练数据(比如异常点,噪声),以提高模型的泛化能力。

此外,添加正则化相当于为模型添加了某种限制,规定了参数的分布,从而降低了模型的复杂度。模型的复杂度降低,意味着模型对于噪声与异常点的抗干扰性的能力增强,从而提高模型的泛化能力。 – 奥卡姆剃刀原理

主动学习

思路:通过机器学习的方法获取到那些比较难分类的样本数据,让人工再次确认和审核,然后将人工标注得到的数据再次使用有监督学习模型或半监督学习模型进行训练,逐步提升模型效果,将人工姜妍融入机器学习的模型中。

主动学习的流程:

  1. 机器学习模型:包括机器学习模型的训练和预测两部分;

https://zhuanlan.zhihu.com/p/301117945

卷积神经网络 CNN

卷积神经网络 – CNN 最擅长的就是图片的处理。它受到人类视觉神经系统的启发。

CNN 有2大特点:

  • 能够有效的将大数据量的图片降维成小数据量
  • 能够有效的保留图片特征,符合图片处理的原则

目前 CNN 已经得到了广泛的应用,比如:人脸识别、自动驾驶、美图秀秀、安防等很多领域。

CNN 解决了什么问题?

在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:

图像需要处理的数据量太大,导致成本很高,效率很低
图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高

需要处理的数据量太大

图像是由像素构成的,每个像素又是由颜色构成的

现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。

假如我们处理一张 1000×1000 像素的图片,我们就需要处理3百万个参数!

1000×1000×3=3,000,000

这么大量的数据处理起来是非常消耗资源的,而且这只是一张不算太大的图片!

卷积神经网络 – CNN 解决的第一个问题就是「将复杂问题简化」,把大量参数降维成少量参数,再做处理。

更重要的是:我们在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。

保留图像特征

图片数字化的传统方式我们简化一下,就类似下图的过程:

假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看,图像的内容(本质)并没有发生变化,只是位置发生了变化。

所以当我们移动图像中的物体,用传统的方式的得出来的参数会差异很大!这是不符合图像处理的要求的。

而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。

那么卷积神经网络是如何实现的呢?在我们了解 CNN 原理之前,先来看看人类的视觉原理是什么?

人类视觉原理

人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:

对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:

我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。

那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?

答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。

典型的 CNN 由3个部分构成:

  1. 卷积层 – 主要作用是保留图片的特征
  2. 池化层 – 主要作用是把数据降维,可以有效的避免过拟合
  3. 全连接层 – 根据不同任务输出我们想要的结果

卷积层负责提取图像中的局部特征;
池化层用来大幅降低参数量级(降维);
全连接层类似传统神经网络的部分,用来输出想要的结果

卷积层

卷积——提取特征

卷积层的运算过程如下图,用一个卷积核扫完整张图片:

这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。

在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们用6中基础模式就能描绘出一副图像。以下就是25种不同的卷积核的示例:

总结:卷积层的通过卷积核的过滤提取出图片中局部的特征,跟上面提到的人类视觉的特征提取类似。

1. 数学原理

卷积操作原理上其实是对两个矩阵进行点乘求和的数学操作,其中一个矩阵为输入的数据矩阵,另一个矩阵则为卷积核(滤波器或特征矩阵),求得的结果表示为原始图像中提取的特定局部特征。

2. 卷积的作用

在图像领域中,深层卷积已经证明比浅层卷积更具表征,从图像的特征提取来看, 不同卷积操作提取到的特征类型是不相同的:

卷积层次 特征类型
浅层卷积 边缘特征
中层卷积 局部特征
深层卷积 全局特征

3. 一些常见的卷积核

在传统图像领域,已经证明一些特殊的卷积核能够执行边缘检测,锐化,模糊等操作, 如下表所示:

卷积作用 卷积核 卷积后图像
输出原图 origin_img
边缘检测(突出边缘差异) edgeDetect-1
边缘检测(突出中间值) edgeDetect-2
图像锐化 sharpen_img
方块模糊 box_blur
高斯模糊 gaussian_blur

4. 卷积核的参数

参数名 作用 常见设置
Kernel Size 卷积核的大小 在过去常设为5,如LeNet-5;现在多设为3,通过堆叠的卷积核来达到更大的感受域
Stride 卷积步长 常见设置为1,表示滑窗距离为1,可以覆盖所有相邻位置特征的组合;当设置为更大值时相当于对特征组合降采样
Padding 填充策略 SAME: 表示对不足卷积核大小的边界位置进行某种填充(通常零填充)以保证卷积输出维度与与输入维度一致;VALID时则对不足卷积尺寸的部分进行舍弃,输出维度就无法保证与输入维度一致
In Channels 卷积核的深度 默认与输入的特征矩阵通道数(深度)一致;在某些压缩模型中会采用通道分离的卷积方式
Out Channels 卷积核的个数 若设置为与输入通道数一样的大小,可以保持输入输出维度的一致性;若采用比输入通道数更小的值,则可以减少整体网络的参数量

5. 几种常见的卷积方式

https://zhuanlan.zhihu.com/p/28186857

6. 从 pytorch 看一维卷积,二维卷积,三维卷积

参数说明

卷积操作常用的有一维卷积,二维卷积与三维卷积,其中,三维卷积用到就比较少了, 三个类在 Pytorch 中的参数都是一样的,只是输入输出维度有所差别罢了。

1
2
3
4
5
6
7
8
9
in_channels: 输入数据的通道数
out_channels: 卷积操作产生的输出通道数
kernels: 卷积核的大小, int 或 tuple, 卷积核的大小设置是需要反复实验测试的。
stride: 卷积步伐,stride 太小,会导致重复计算较多,计算量大; 而太大,有可能会造成特征遗漏。
padding: 输入数据的每一条边填充0的层数, int 或 tuple, 默认为0
padding_mode: 填充方式, zeros: 以0为填充数据
dilation: 卷积核中元素之间的间距, 默认为 1
groups: 从输入通道到输出通道的阻塞连接数, 默认为1
bias: 是否添加 bias, 默认为True

一维卷积

1
2
3
4
5
6
7
8
9
class torch.nn.Conv1d:

-- 输入输出数据:
Input: [N, C_in, L_in]: [batch_size, in_channels, input_len]
Output: [N, C_out, L_out]: [batch_size, out_channels, output_len]

-- 参数:
权重参数: [out_channels, in_channels/groups, kernel_size], 默认初始化为均匀分布
Bias参数: [out_channels], 默认初始化为均匀分布

一维卷积在NLP中常用于 Embedding 部分来提取特征,如在TextCNN中就有使用, 此时可以将词向量维度理解为通道数C_in, 输入序列的长度为 L_in

注意一点的是,在一维卷积中,卷积核的大小是一维的, 即如 果指定为 n, 则卷积核的大小为 [n, 1, 1]

二维卷积

2dconv

  • 单通道:若输入卷积核尺寸为 ,卷积核在输入图像的空间维度上进行滑窗操作,每次滑窗和 窗口内的值进行卷积操作,得到输出图像中的一个值。
  • 多通道:输入图像特征通道数为3,卷积核尺寸为 ,每次滑窗与3个通道上的 窗口内的所有值进行卷积操作,得到输出图像中的一个值。
1
2
3
4
5
6
7
8
9
class torch.nn.Conv2d:

-- 输入输出数据:
Input: [N, C_in, H_in, L_in]: [batch_size, in_channels, input_len]
Output: [N, C_out, H_out, L_out]: [batch_size, out_channels, output_len]

-- 参数:
权重参数: [out_channels, in_channels/groups, kernel_size], 默认初始化为均匀分布
Bias参数: [out_channels], 默认初始化为均匀分布

三维卷积

3dconv

7. 卷积核的选择

大卷积核虽然可以获取更大的感受域,但是大卷积核反而会导致计算量大幅增加,不利于训练更深层的模型,相应的计算能力也会降低。

堆叠2个 3×3 卷积核(二通道)可以获得与 5×5卷积核 相同的感受视野,同时参数量会更少(3×3×2+1<5×5×1+1),这也是 3×3卷积 应用更广泛的原因,在大多数情况下通过堆叠较小的卷积核比直接采用单个更大的卷积核会更加有效。

激活层

激活层本质就是采用激活函数对卷积出的特征做一个非线性变换。

  • 首选 Relu, 然后试试 Relu 变体 Leaky Relu 和 Maxout。
  • 某些情况下 tanh 也能获得不错结果。

池化层(下采样) 数据降维,避免过拟合

池化层简单说就是下采样,他可以大大降低数据的维度。其过程如下:

上图中,我们可以看到,原始图片是20×20的,我们对其进行下采样,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。

之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。

总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。

数学原理

池化层的作用是对感受域内的特征进行筛选,提取区域内最具代表性的特征,能够有效地降低特征尺度,进而减少模型所需要的参数量,此外还可以防止过拟合现象。

池化操作的本质是降采样。其除了能显著降低参数数量外,还能保持对平移,伸缩,旋转操作的不变性。

  • 常见的池化操作:选择指导 (Boureau et al., 2010)

    • 最大池化: Max Pooling
    • 平均值池化: Mean Pooling

无论max pooling还是mean pooling,都没有需要学习的参数。因此,在卷积神经网络的训练中,Pooling层需要做的仅仅是将误差层传递到上一层,而没有梯度的计算。

对于max Pooling,下一层的误差项的值会原封不动的传递到上一层对应区块中的最大值所对应的神经元,而其他神经元的误差项都是0。

对于 mean Pooling, 下一层的误差项会均匀划分到该层的所有的神经元上。

卷积层与池化层比较

卷积层 池化层
结构 零填充时输出维度不变,而通道数改变 通常特征维度会降低,通道数不变
稳定性 输入特征发生细微改变时,输出结果会改变 感受域内的细微变化不影响输出结果
作用 感受域内提取局部关联特征 感受域内提取泛化特征,降低维度
参数量 与卷积核尺寸、卷积核个数相关 不引入额外参数

全连接层 — 输出结果

这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。

经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。

典型的 CNN 并非只是上面提到的3层结构,而是多层结构,例如 LeNet-5 的结构就如下图所示:

卷积层 – 池化层- 卷积层 – 池化层 – 卷积层 – 全连接层

在了解了 CNN 的基本原理后,我们重点说一下 CNN 的实际应用有哪些。

NLP 与 CV 中使用 CNN 的区别

NLP CV
卷积核 多为一维卷积, 通常都是由较为浅层的卷积层组成 对二维信号做卷积,一般设为叠加的3×3卷积核
Pooling 一般采用 Max-Pooling
全连接层 一般常采用LN + dropout 一般常采用BN + dropout

CNN 的实际应用

  • 图片分类、检索
  • 目标定位检测
  • 目标分割
  • 人脸识别
  • 骨骼识别

QA

1. 为什么需要 Padding ?

图像是 5 × 5的矩阵,我们的卷积核是 3 × 3的,最终我们得出的feature map是 3 × 3 的矩阵(n -f + 1) 。

这样会带来两个问题:

  • 每一次做卷积操作时,你的图像就会缩小,如果这种情况发生多次,你的图像就会变得很小。

  • 边缘的像素点所受到的关注点比中心的关注点少很多。比如上图的 1 * 1 的像素点只进行了一次卷积计算,而中心点 3 * 3 却进行了9次卷积计算,这明显是不公平的。这意味着图像边缘的信息大多都丢失了。

如果加上 paddding 之后,我们的 feature-map 就变为 (n + 2p - f + 1) × (n + 2p - f + 1)的矩阵。

Padding存在的意义在于:

  • 为了不丢弃原图信息

  • 为了保持feature map 的大小与原图一致

  • 为了让更深层的layer的 input 依旧保持有足够大的信息量

  • 为了实现上述目的,且不做多余的事情,padding出来的pixel的值都是0,不存在噪音问题。

2. 为什么卷积核设计尺寸都是奇数

  • 保证像素点中心位置,避免位置信息偏移
  • 填充边缘时能保证两边都能填充,原矩阵依然对称

3. 卷积操作的特点

  • **稀疏交互:**卷积神经网络中,卷积核尺度远小于输入的尺度,这样每个输出神经网仅与前一层区域内的神经元存在连接权重,我们称此为稀疏交互。

    • 提高了模型的统计效率:原本一幅图像只能提供少量特征,现在每一块像素区域都可以提供一部分特征
    • 使得参数大量减少,优化的时间复杂度也会减小几个数量级,过拟合情况也得到改善。
    • 稀疏交互的意义在于,先从局部的特征入手,再将局部特征组合起来形成更复杂和抽象的特征
  • 参数共享: 参数共享指的是同一个模型的不同模块中使用相同的参数。参数共享的意义在于使得卷积层具有平移等特性

    • 权重共享一定程度上能增强参数之间的联系,获得更好的共性特征
    • 很大程度上降低了网络的参数,节省计算量和计算所需内存
    • 权重共享能起到很好正则的作用。正则化的目的是为了降低模型复杂度,防止过拟合,而权重共享则正好降低了模型的参数和复杂度。
  • 平移不变性:(局部)平移不变性是一个很有用的性质,尤其是当我们关心某个特征是否出现而不关心它出现的具体位置时。平移不变性是由于参数共享 和池化 所带来的。

4. 你觉得 CNN 有什么不足?

  • 信息损失问题。 CNN在Pooling的时候会丢失大量的有价值信息,以及忽略局部与整体之间的关联性比如得分最高的特征只出现了一次,而得分第二高的特征出现了很多次,得分第二高的特征可能比最高的特征还要重要,却被丢弃了,自然造成了不小的信息损失

  • 忽略了位置信息:一个区域有用的特征极有可能和另一个区域的信息有联系,如TextCNN:对于一些粒度较粗的分类问题如话题分类,位置信息可能不大,但对于如情感分析这种粒度较细的分类问题,位置信息不足便会导致一些问题,如”虽然他长的很帅,但是人品不好”和”虽然他人品不好,但他长得帅啊”,在情感倾向上区别还是比较明显的。

5. CNN 与 RNN 的优劣

  • 并行能力, 训练时间很漫长
  • RNN 容易发生梯度消失,包括 LSTM
  • CNN 的感受视野受限于卷积核,需要深层的 CNN 网络来获得更大的感受视野

6. 卷积,池化的意义

  • 卷积和池化可能导致欠拟合
    • 如果一项任务涉及到要对输入中相隔较远的信息进行合并时,那么卷积可能就不正确了。
    • 如果一项任务依赖于保存精确的空间信息,那么在所有的特征上使用池化将会增大训练误差。
  • 当我们比较卷积模型的统计学习表现时,只能以基准中的其他卷积模型作为比较的对象

7. 卷积中不同零填充的影响

假定 m, k 分别代表图像的宽度和卷积核的宽度:

  • Valid 卷积(有效卷积):不使用零填充,卷积核只允许访问那些图像中能够完全包含整个核的位置,输出的宽度为 m − k + 1
    • 在这种情况下,输出的所有像素都是输入中相同数量像素的函数,这使得输出像素的表示更加规范。
    • 然而,输出的大小在每一层都会缩减,这限制了网络中能够包含的卷积层的层数。(一般情况下,影响不大,除非是上百层的网络)
  • Same 卷积(相同卷积):只进行足够的零填充来保持输出和输入具有相同的大小,即输出的宽度为 m.
    • 在这种情况下,只要硬件支持,网络就能包含任意多的卷积层。
    • 然而,输入像素中靠近边界的部分相比于中间部分对于输出像素的影响更小。这可能会导致边界像素存在一定程度的欠表示。
  • **Full 卷积(全卷积):**进行足够多的零填充使得每个像素都能被访问 k 次(非全卷积只有中间的像素能被访问 k 次),最终输出图像的宽度为 m + k − 1
    • 因为 same 卷积可能导致边界像素欠表示,从而出现了 Full 卷积;
    • 但是在这种情况下,输出像素中靠近边界的部分相比于中间部分是更少像素的函数。这将导致学得的卷积核不能再所有所有位置表现一致
    • 事实上,很少使用 Full 卷积

通常零填充的最优数量处于 “有效卷积”和 “相同卷积” 之间。

8. 1 * 1 卷积的作用?

https://zhuanlan.zhihu.com/p/40050371

  • 实现信息的跨通道交互和整合。
  • 对卷积核通道数进行降维和升维,减小参数量。

9. 卷积核是否越大越好?

卷积核越大,参数量越多。 前期无法使用较小卷积核是因为,前期的模型无法做的很深,这样限制了卷积核的感受视野。但其实,通过堆叠2 个 3 * 3 卷积核可以获得与 5 * 5 卷积核相同的感受视野,同时参数量特更少。 因此,大多数情况下,通过堆叠较小的卷积核比直接采用单个较大的卷积核更加有效。

自然语言中, TextCNN 就采用单层的卷积核,此时选择合适的,较大的卷积核相对比较重要, 而DPCNN 中,因为能够将卷积做的很深,那么就可以采用3 * 3 的卷积核来做了。

10. 如何减少卷积层参数量?

  • 用深层小卷积代替浅层大卷积
  • 使用分离卷积操作:将原本的卷积操作分离为的两部分操作
  • 添加 卷积
  • 在卷积层前使用池化操作

11. CNN 特点

  • 区域不变性: filter 在每层的输入向量(图像)上滑动,检测的是局部信息,然后通过pooling取最大值或均值。pooling这步综合了局部特征,失去了每个特征的位置信息。

    这很适合基于图像的任务,比如要判断一幅图里有没有猫这种生物,你可能不会去关心这只猫出现在图像的哪个区域。但是在NLP里,词语在句子或是段落里出现的位置,顺序,都是很重要的信息。

  • 局部组合性: CNN中,每个滤波器都把较低层的局部特征组合生成较高层的更全局化的特征。

    这在CV里很好理解,像素组合成边缘,边缘生成形状,最后把各种形状组合起来得到复杂的物体表达。在语言里,当然也有类似的组合关系,但是远不如图像来的直接。而且在图像里,相邻像素必须是相关的,相邻的词语却未必相关。

12. 为何较大的batch size 能够提高 CNN 的泛化能力?

在相同迭代次数和学习率的条件下,每批次采用更多的数据将有助于模型更好的学习到正确的模式,模型输出结果也会更加稳定

13. SAME 与 VALID 的区别

  • SAME: 宽卷积,通常采用零填充的方式对卷积核不满足整除条件的输入特征进行补全,以使卷积层的输出维度保持与输入特征维度一致。
  • VALID:窄卷积,不进行任何填充,在输入特征边缘位置若不足以进行卷积操作,则对边缘信息进行舍弃,因此在步长为1的情况下该填充方式的卷积层输出特征维度可能会略小于输入特征的维度。

14. CNN 优缺点

优点:

  • 共享卷积核,优化计算量。
  • 无需手动选取特征,训练好权重,即得特征。
  • 深层次的网络抽取图像信息丰富,表达效果好。
  • 保持了层级网络结构。
  • 不同层次有不同形式与功能。

缺点:

  • 需要调参,需要大样本量,GPU等硬件依赖。
  • 物理含义不明确。

基本单元 MLP

deep-learning

感知机

1. 万能近似定理

一个前馈神经网络如果具有至少一个非线性输出层,那么只要给予网络足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的函数。

万能近似定理表明一个单层的网络就足以表达任意函数,但是该层的维数可能非常大,且几乎没有泛化能力;此时,使用更深的模型能够减少所需的单元数,同时增强泛化能力(减少泛化误差)。参数数量相同的情况下,浅层网络比深层网络更容易过拟合。

2.在深度神经网络中,非线性单元,放弃了训练问题的凸性,其意义何在?

放弃训练问题的凸性,简单来说,就是放弃寻求问题的最优解。

非线性单元的加入,使训练问题不再是一个凸优化问题。这意味着神经网络很难得到最优解,即使一个只有两层和三个节点的简单神经网络,其训练优化问题仍然是 NP-hard 问题 (Blum & Rivest, 1993).

但即使如此,使用神经网络也是利大于弊的:

  • 人类设计者只需要寻找正确的函数族即可,而不需要去寻找精确的函数。
  • 使用简单的梯度下降优化方法就可以高效地找到足够好的局部最小值
  • 增强了模型的学习/拟合能力,如原书中所说“ maxout 单元可以以任意精度近似任何凸函数”。至于放弃凸性后的优化问题可以在结合工程实践来不断改进。 “似乎传统的优化理论结果是残酷的,但我们可以通过工程方法数学技巧来尽量规避这些问题,例如启发式方法、增加更多的机器和使用新的硬件(如GPU)。”

3. 如何解决非线性问题

  • 手动去设计一个非线性转换
  • 核方法:其实内部本质也是非线性变换
  • 神经网络:依据激活函数来提供非线性

循环神经网络 RNN

卷积神经网络 – CNN 和普通的算法大部分都是输入和输出的一一对应,也就是一个输入得到一个输出。不同的输入之间是没有联系的

但是在某些场景中,一个输入就不够了!

为了填好下面的空,取前面任何一个词都不合适,我们不但需要知道前面所有的词,还需要知道词之间的顺序。

这种需要处理「序列数据 – 一串相互依赖的数据流」的场景就需要使用 RNN 来解决了。

典型的集中序列数据:

  1. 文章里的文字内容
  2. 语音里的音频内容
  3. 股票市场中的价格走势
  4. ……

RNN 之所以能够有效的处理序列数据,主要是基于他的比较特殊的运行原理。下面给大家介绍一下 RNN 的基本运行原理。

原理

传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:

RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:

下面用一个具体的案例来看看 RNN 是如何工作的:

假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词:

然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出「01」

然后,我们按照顺序,将“time”输入到 RNN 网络,得到输出「02」。

这个过程我们可以看到,输入 “time” 的时候,前面 “what” 的输出也产生了影响(隐藏层中有一半是黑色的)。

以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。如下图所示:

当我们判断意图的时候,只需要最后一层的输出「05」,如下图所示:

RNN 的缺点也比较明显

通过上面的例子,我们已经发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。

  1. RNN 有短期记忆问题,无法处理很长的输入序列
  2. 训练 RNN 需要投入极大的成本

由于 RNN 的短期记忆问题,后来又出现了基于 RNN 的优化算法,下面给大家简单介绍一下。

RNN 的优化算法 LSTM

RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。

LSTM 做的最大的改变就是打破了这个死板的逻辑,而改用了一套灵活了逻辑——只保留重要的信息。

简单说就是:抓重点!

举个例子,我们先快速的阅读下面这段话:

当我们快速阅读完之后,可能只会记住下面几个重点:

LSTM 类似上面的划重点,**他可以保留较长序列数据中的「重要信息」,忽略不重要的信息。**这样就解决了 RNN 短期记忆的问题。

从 LSTM 到 GRU

Gated Recurrent Unit – GRU 是 LSTM 的一个变体。他保留了 LSTM 划重点,遗忘不重要信息的特点,在long-term 传播的时候也不会被丢失。

GRU 主要是在 LSTM 的模型上做了一些简化和调整,在训练数据集比较大的情况下可以节省很多时间。

RNN 的应用和使用场景

只要涉及到序列数据的处理问题,都可以使用到,NLP 就是一个典型的应用场景。

文本生成: 类似上面的填空题,给出前后文,然后预测空格中的词是什么。

机器翻译: 翻译工作也是典型的序列问题,词的顺序直接影响了翻译的结果。

语音识别: 根据输入音频判断对应的文字是什么。

生成图像描述: 类似看图说话,给一张图,能够描述出图片中的内容。这个往往是 RNN 和 CNN 的结合。

视频标记: 他将视频分解为图片,然后用图像描述来描述图片内容。

总结

RNN的独特价值在于:它能有效的处理序列数据。比如:文章内容、语音音频、股票价格走势…

之所以他能处理序列数据,是因为在序列中前面的输入也会影响到后面的输出,相当于有了“记忆功能”。但是 RNN 存在严重的短期记忆问题,长期的数据影响很小(哪怕他是重要的信息)。

于是基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:

  1. 长期信息可以有效的保留
  2. 挑选重要信息保留,不重要的信息会选择“遗忘”

RNN 几个典型的应用如下:

  • 文本生成
  • 语音识别
  • 机器翻译
  • 生成图像描述
  • 视频标记

基础相关


QA

1. RNN 中为何会出现梯度消失,梯度爆炸问题

RNN 的梯度消失问题

因此, RNN 的梯度消失,梯度爆炸问题在于:

2. Relu 能否作为RNN的激活函数

答案是可以,但会产生一些问题:

  • 换成 Relu 可能使得输出值变得特别大,从而产生溢出
  • 换成Relu 也不能解决梯度消失,梯度爆炸问题,因为还有 连乘的存在(如1中公式)

为什么 CNN 和前馈神经网络采用Relu 就能解决梯度消失,梯度爆炸问题?

因为CNN 或 FNN 中各层的 W 并不相同, 且初始化时是独立同分布的,一定程度熵可以抵消。

而 RNN 中各层矩阵 是一样的。

3. 推导 LSTM

关键在于三个门, 三个状态。 其中三个门的公式基本一样

  • 遗忘门: 决定上一时刻的 多少保留到当前时刻
  • 输入门:决定当前时刻输入 有多少保存到当前时刻

  • 输出门:控制当前时刻的 有多少信息作为当前时刻的 :

  • 当前输入的状态 : 将上一时刻的 与当前时刻的 融合:

  • 当前时刻的状态 : 将 , 融合:

  • 当前时刻的输出 :从 中分出一部分信息:

4. LSTM 长短记忆机制

长短记忆机制主要通过 输入门遗忘门 来实现:

  • 如果当前信息不重要, 则输入门相应维度接近于 0, 当前的信息就几乎不融入进入 。反之, 输入门相应维度接近于 1, 当前信息实现很好的融入。
  • 如果之前的信息 不重要,则遗忘门相应维度接近于 0, 过去的信息就几乎不融入进 。 反之,亦然。

5. LSTM的门机制为何选择 sigmoid 作为激活函数?

值得一提的是, 目前几乎所有主流的门控机制中,门控单元的选择均使用 sigmoid 。

  • sigmoid 的饱和性: 十分符合 门控 的效果
  • 值域在 (0,1), 当输入较大或较小时,输出会接近1 或 0, 从而保证门的开或关。

6. 融合信息时为何选择 tanh?

  • 值域为 (-1, 1), 这样会带来两个好处:

    • 与大多数情景下特征分布以 0 为中心相吻合。(激活函数一章中有提到这点特性的重要性)
    • 可以避免前向传播时的数值溢出问题(主要是上溢)
  • tanh 在 0 附近有较大的梯度,模型收敛更快

7. 计算资源有限的情况下有没有什么优化方法?

  • 采用 Hard gate
  • 采用 GRU

8. 推导一下 GRU

两个门,两个状态

  • 更新门:控制前一时刻状态信息与当前输入融合

  • 重置门:控制前一时刻状态信息

  • 当前输入的信息融入

  • 当前时刻的状态:

9. LSTM 与 GRU 之间的关系

  • GRU 认为遗忘门输入门功能有一定的的重合,认为之前的信息 与 当前的输入信息是此消彼长的关系,因此将二者合并成一个门: 更新门。
  • 合并了记忆状态 c 与隐藏状态 h
  • 采用重置门代替了输出门

10 为何RNN 会有梯度消失现象,推一下?

RNN 的梯度消失问题

11. LSTM 与 GRU 区别

  • LSTM 中的单元状态 c 与 GRU 中的 h 类似,但 GRU 去掉了 h 这个状态,即最后的输出不再进行调节,那么也就不需要输出门了
  • 在产生新的全局状态时, LSTM 采用 输入门+遗忘门 的方式, 而 GRU 只采用更新门来控制
  • 更新门起到了遗忘门的作用, 重置门起到了输入门的作用。

12. 为何 RNN 训练时 loss 波动很大

由于RNN特有的memory会影响后期其他的RNN的特点,梯度时大时小,learning rate没法个性化的调整,导致RNN在train的过程中,Loss会震荡起伏。

为了解决RNN的这个问题,在训练的时候,可以设置临界值,当梯度大于某个临界值,直接截断,用这个临界值作为梯度的大小,防止大幅震荡。

13. LSTM 中的激活函数选择

LSTM, 门的激活函数选择 Sigmoid, 而在生成 c 时采用 tanh。

  • Sigmoid函数的输出在0~1之间,符合门控的物理定义。且当输入较大或较小时,其输出会非常接近1或0,从而保证该门开或关。
  • 在生成候选记忆时,使用Tanh函数,是因为其输出在−1~1之间,这与大多数场景下特征分布是0中心的吻合。此外,Tanh函数在输入为0附近相比Sigmoid函数有更大的梯度,通常使模型收敛更快。

长短期记忆网络 LSTM

原理

长短期记忆网络——通常被称为 (Long-Short Term Memory,LSTM),是一种特殊的 RNN,能够学习长期依赖性。由 Hochreiter 和 Schmidhuber(1997)提出的,并且在接下来的工作中被许多人改进和推广。LSTM 在各种各样的问题上表现非常出色,现在被广泛使用。

LSTM 被明确设计用来避免长期依赖性问题。长时间记住信息实际上是 LSTM 的默认行为,而不是需要努力学习的东西!

所有递归神经网络都具有神经网络的链式重复模块。在标准的 RNN 中,这个重复模块具有非常简单的结构,例如只有单个 tanh 层。

LSTM 也具有这种类似的链式结构,但重复模块具有不同的结构。不是一个单独的神经网络层,而是四个,并且以非常特殊的方式进行交互。

不要担心细节。稍后我们将逐步浏览 LSTM 的图解。现在,让我们试着去熟悉我们将使用的符号。

在上面的图中,每行包含一个完整的向量,从一个节点的输出到其他节点的输入。粉色圆圈表示逐点运算,如向量加法;而黄色框表示学习的神经网络层。行合并表示串联,而分支表示其内容正在被复制,并且副本将转到不同的位置。

核心思路

LSTM 的关键是细胞状态,即图中上方的水平线。

细胞状态有点像传送带。它贯穿整个链条,只有一些次要的线性交互作用。信息很容易以不变的方式流过。

LSTM 可以通过所谓“门”的精细结构向细胞状态添加或移除信息。

门可以选择性地以让信息通过。它们由 S 形神经网络层和逐点乘法运算组成。

S 形网络的输出值介于 0 和 1 之间,表示有多大比例的信息通过。0 值表示“没有信息通过”,1 值表示“所有信息通过”。

一个 LSTM 有三种这样的门用来保持和控制细胞状态。

基础理论 AUC计算

基础理论 Softmax

1. Softmax 定义

2. Softmax 损失


QA

1. 为何一般选择 softmax 为多分类的输出层

虽然能够将输出范围概率限制在 [0,1]之间的方法有很多,但 Softmax 的好处在于, 它使得输出两极化:正样本的结果趋近于 1, 负样本的结果趋近于 0。 可以说, Softmax 是 logistic 的一种泛化。

基础理论 偏差 vs 方差,欠拟合 vs 过拟合

参考: 偏差与方差, 欠拟合与过拟合

定义

  • 记在训练集 D 上学得的模型为

    模型的期望预测

  • 偏差(Bias)

    偏差度量了学习算法的期望预测真实结果的偏离程度,即刻画了学习算法本身的拟合能力;

  • 方差(Variance)

    方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响(模型的稳定性);

  • 噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。

  • 偏差-方差分解”表明模型的泛化能力是由算法的能力、数据的充分性、任务本身的难度共同决定的。

理解概念

  • 偏差: 表示模型在训练集上的表现,与训练误差成线性关系, 用于描述模型的拟合能力
  • 方差: 表示模型在(开发集或测试集)与测试误差-训练误差成线性关系,用于描述模型的泛化能力。

四种情况

  1. 偏差很低,方差很高: 意味着训练误差很低,测试误差很高,此时发生了过拟合现象。
  2. 偏差很高,方差很低: 意味着训练误差,测试误差都很高,此时发生了欠拟合现在。
  3. 偏差,方差都很高: 意味着此时同时发生了欠拟合和过拟合现象。
  4. 偏差很低,方差很低: 意味着训练误差很低,测试误差也很低,表示我们的模型训练的结果很好。

偏差与欠拟合,方差与过拟合

  • 偏差通常是由于我们定义的模型不合适或模型复杂度不够,所造成的现象为欠拟合。
  • 方差主要是由于模型复杂度过高造成的, 所造成的现象是过拟合。

如何降低偏差(欠拟合)

  1. 加大模型规模(更换其余机器学习算法,神经网络可以增加每层神经元/神经网络层数):

    偏差很高很有可能是因为模型的拟合能力差,对于传统机器学习算法,各个方法的拟合能力不同,选择一个拟合能力更好的算法往往能够得出很好的结果。 对于神经网络(拟合能力最强)而言,通过增加网络层数或增加每层单元数就能够很好的提高模型的拟合能力[3][4][5]。

  2. 根据误差分析结果来修改特征:

    我们需要将错误样本分类,判断可能是由于什么原因导致样本失败,在针对分析结果,增加或减少一些特征。

  3. 减少或去除正则化: 这可以避免偏差,但会增大方差。

  4. 修改模型结构,以适应你的问题:对于不同的问题,不同的模型结构会产生更好的结果,比如在CV中常用CNN,而在NLP领域常用LSTM。

如何降低方差(过拟合)

  1. 重新分析,清洗数据。

    有时候,造成方差很大的原因往往是由于数据不良造成的,对于深度学习来说,有一个大规模,高质量的数据集是极为重要的。

  2. 添加更多的训练数据。

    增大训练数据能够往往能够提高模型的泛化能力。可以采用数据增强技术。

  3. 加入正则化。

  4. 加入提前终止。

    意思就是在训练误差变化很慢甚至不变的时候可以停止训练,这项技术可以降低方差,但有可能增大了偏差。 提前终止有助于我们能够在到达最佳拟合附近,避免进入过拟合状态。

  5. 通过特征选择减少输入特征的数量和种类。

    显著减少特征数量能够提高模型的泛化能力,但模型的拟合能力会降低,这意味着,该技术可以减小方差,但可能会增大偏差。 不过在深度学习中,我们往往直接将所有特征放入神经网络中,交给算法来选择取舍。

  6. 减少模型规模,降低模型复杂度(每层神经元个数/神经网络层数): 谨慎使用。

    一般情况下,对于复杂问题如CV或NLP等问题不会降低模型复杂度,而对于简单问题,采用简单模型往往训练速度更快,效果很好。

  7. 根据误差分析结果修改输入特征。

  8. 修改模型架构,使之更适合你的问题。 一般可以选择简单模型的情况下,不选择复杂模型。

  9. 集成学习。

基础理论 分类问题评估指标

几个定义:混淆矩阵

  • TP: True Positives, 表示实际为正例且被分类器判定为正例的样本数
  • FP: False Positives, 表示实际为负例且被分类器判定为正例的样本数
  • FN: False Negatives, 表示实际为正例但被分类器判定为负例的样本数
  • TN: True Negatives, 表示实际为负例且被分类器判定为负例的样本数

一个小技巧, 第一个字母表示划分正确与否, T 表示判定正确(判定正确), F表示判定错误(False); 第二个字母表示分类器判定结果, P表示判定为正例, N表示判定为负例。

几个常规的指标

Accuracy:

Accuracy 能够清晰的判断我们模型的表现,但有一个严重的缺陷: 在正负样本不均衡的情况下,占比大的类别往往会成为影响 Accuracy 的最主要因素,此时的 Accuracy 并不能很好的反映模型的整体情况。

Precision:

Recall:

Precision 与 Recall 的权衡

精确率高,意味着分类器要尽量在 “更有把握” 的情况下才将样本预测为正样本, 这意味着精确率能够很好的体现模型对于负样本的区分能力,精确率越高,则模型对负样本区分能力越强。

召回率高,意味着分类器尽可能将有可能为正样本的样本预测为正样本,这意味着召回率能够很好的体现模型对于正样本的区分能力,召回率越高,则模型对正样本的区分能力越强。

从上面的分析可以看出,精确率与召回率是此消彼长的关系, 如果分类器只把可能性大的样本预测为正样本,那么会漏掉很多可能性相对不大但依旧满足的正样本,从而导致召回率降低。

F1 Score

F1-Score 能够很好的评估模型,其主要用于二分类问题, 计算如下:

而 更一般的有

其实, 本质上是Recall, Precision 权重比, 当 时, 表明 Recall 的权重要比Precision高,其影响更大, ; 当 时, 表明 Recall 的权重要比Precision低, 对应的影响更小;

前面提到 F1 针对的是二分类,而更一般的是,对于多分类问题来说, F1 的计算有多种方式,可以参见 Scikit-Learn 中的评价指标,我们来分别介绍一下。

对于一个多分类问题,假设,对于分类 而言有:, 那么各种 F1 的值计算如下。

Macro F1: 宏平均

Macro 算法在计算 Precision 与 Recall 时是先分别计算每个类别的Precision 与 Recall, 然后再进行平均。

那么我们就得到最终的 Macro F1 的计算为:

我们看到, Macro F1 本质上是所有类别的统计指标的算术平均值来求得的,这样单纯的平均忽略了样本之间分布可能存在极大不平衡的情况

Micro F1 :微平均

Micro 算法在计算 Precision 与 Recall 时会将所有类直接放到一起来计算。

Macro vs Micro [1]

Macro 相对 Micro 而言,小类别起到的作用更大,举个例子而言,对于一个四分类问题有:

  • class A: 1 TP, 1 FP
  • class B: 10 TP , 90 FP
  • class C: 1 TP, 1 FP
  • class D: 1 TP, 1 FP

那么对于 Precision 的计算有:

我们看到,对于 Macro 来说, 小类别相当程度上拉高了 Precision 的值,而实际上, 并没有那么多样本被正确分类,考虑到实际的环境中,真实样本分布和训练样本分布相同的情况下,这种指标明显是有问题的, 小类别起到的作用太大,以至于大样本的分类情况不佳。 而对于 Micro 来说,其考虑到了这种样本不均衡的问题, 因此在这种情况下相对较佳。

总的来说, 如果你的类别比较均衡,则随便; 如果你认为大样本的类别应该占据更重要的位置, 使用Micro; 如果你认为小样本也应该占据重要的位置,则使用 Macro; 如果 Micro << Macro , 则意味着在大样本类别中出现了严重的分类错误; 如果 Macro << Micro , 则意味着小样本类别中出现了严重的分类错误。

为了解决 Macro 无法衡量样本均衡问题,一个很好的方法是求加权的 Macro, 因此 Weighed F1 出现了。

Weight F1

Weighted 算法算术 Macro 算法的改良版,是为了解决Macro中没有考虑样本不均衡的原因, 在计算 Precision与Recall 时候,各个类别的 Precision 与 Recall要乘以该类在总样本中的占比来求和:

那么我们就得到最终的 Macro F1 的计算为:

MCC :马修斯相关系数

MCC 主要用于衡量二分类问题,其综合考虑了 TP TN, FP , FN, 是一个比较均衡的指标, 对于样本不均衡情况下也可以使用。MCC的取值范围在 [-1, 1], 取值为1 表示预测与实际完全一致, 取值为0表示预测的结果还不如随机预测的结果, -1 表示预测结果与实际的结果完全不一致。因此我们看到, MCC 本质上描述了预测结果与实际结果之间的相关系数。

值得注意的是,对于两个分类器而言,可能其中一个分类器的 F1 值较高,而其 MCC 值较低, 这表示单一的指标是无法衡量分类器的所有优点与缺点的。

ROC 曲线

在分类任务中,测试部分通常是获得一个概率表示当前样本属于正例的概率, 我们往往会采取一个阈值,大于该阈值的为正例, 小于该阈值的为负例。 如果我们减小这个阈值, 那么会有更多的样本被识别为正类,这会提高正类的识别率,但同时会降低负类的识别率。

为了形象的描述上述的这种变化, 引入ROC曲线来评价一个分类器的好坏。 ROC 曲线主要关注两个指标:

其中, FPR 代表将负例错分为正例的概率, TPR 表示能将正例分对的概率, 如果我们增大阈值, 则 TPR 会增加,而对应的FPR也会增大, 而绘制ROC曲线能够帮助我们找到二者的均衡点,下图很清晰的描述了ROC 曲线关系:

在 ROC 曲线中, 有:

  • FPR = 0, TPR = 0: 表示将每一个实例都预测为负类
  • FPR = 1, TPR = 1:表示将每一个实例都预测为正例
  • FPR = 0, TPR = 1:为最优分类点
  • 分类器对应的ROC曲线应该尽可能靠近坐标轴的左上角, 而对角线的位置意味着分类器的效果和随机猜测一样的差。

**ROC曲线在测试集中的样本分布发生变化的时候能够保持不变。**但遗憾的是,很多时候, ROC 曲线并不能清晰的说明哪个分类器的效果更好, 而 AUC 恰恰能够对分类器做出直观的评价。

AUC:Area under Curve

AUC 为ROC 曲线下的面积, 这个面积的数值介于0到1之间, 能够直观的评价出分类器的好坏, AUC的值越大, 分类器效果越好。

  • AUC = 1: 完美分类器, 采用该模型,不管设定什么阈值都能得出完美预测(绝大多数时候不存在)
  • 0.5 < AUC < 1: 优于随机猜测,分类器好好设定阈值的话,有预测价值
  • AUC = 0.5: 跟随机猜测一样,模型没有预测价值
  • AUC < 0.5 :比随机猜测还差,但是如果反着预测,就优于随机猜测。

值得一提的是,两个模型的AUC 相等并不代表模型的效果相同, 比如这样:

实际场景中, AUC 的确是非常常用的一种指标。

需要注意的是, 在多分类场景下的 ROC 曲线以及 AUC 值, 此时 ROC 曲线应该有多个, 而AUC 的计算如下:

P-R 曲线

P-R 曲线其横坐标为 Recall, 纵坐标为 Precision, 其能帮助我们很好的做出权衡

在上图中,我们发现, A 完全包住了C, 着意味着A 的Precision 与 Recall 都高于C, A优于C。 而对比 A,B, 二者存在交叉的情况,此时采用曲线下面积大小衡量性能,面积越大,性能越好,此处的A优于B。

最后

对于最终分类指标的选择, 在不同数据集,不同场景,不同时间下都会有不同的选择,但往往最好选出一个指标来做优化,对于二分类问题,我目前用 AUC 比较多一些, 多分类我还是看 F1 值。

Reference

[1] Should I make decisions based on micro-averaged or macro-averaged evaluation measures?

[2] Micro Average vs Macro average Performance in a Multiclass classification setting>

[3 机器学习性能评估指标

QA

1. 训练集中类别不平衡,哪个参数最不准确?

Accuracy

基础理论 指数加权平均

指数加权平均本质上是一种近似求取平均值的方法。

我们也以吴恩达课上的例子举例, 假设

  • 表示从第0天到第 天的平均温度值。
  • 表示第 t 点的温度值。

我们具体展开来说, 假设时间 ,加权参数 , 那么则有:

我们将上式带入化简有:

观察上式我们发现, 指数加权平均实质上就是以指数式加权递减的移动平均。 各数值的加权而随时间而指数式递减,越近期的数据加权越重,但较旧的数据也给予一定的加权。

但有一点需要注意的是, 我们观察上式,在最后一项中它的系数为 , 这个数已经很接近于0了, 这就意味着,在 时刻对加权平均值所起到的作用微乎其微, 继而引出一个问题: 我们加权平均所得到的值到底平均了多少天?

答案是 天。这是因为当 时, 有 , 当 时, 有 , 也就是说当权重下降到 (或者说) 以下时就被忽略不计了。

前面说到指数平均的本质依旧是计算平均值,那么在深度学习中为什么不使用我们常用的平均值求法,而要搞得这么复杂呢? 答案是效率以及内存问题。

在深度学习中,数据量经常是非常庞大的, 如果我们使用传统方法来计算平均值,无论是从内存还是从计算量上, 对计算机的压力是很大的, 而对比对数加权平均方法, 我们每次只需要保存上一时刻的值,无论是内存开销还是计算量都小的可怜。

偏差修正

当我们还有指数加权平均来计算平均值时, 一开始的指数加权平均值会很小, 不能代表平均值, 所以需要使用偏差修正:

但是一般机器学习并不关心一开始的指数加权平均值,所以可以不用偏差修正来修正。

基础理论 数据角度看深度学习

数据集定义

  • 训练集: 训练集用来训练你的模型,来确定模型的参数而非超参数,这些参数往往称为学习参数, 如权重参数W, 偏置参数b。
  • **验证集:**交叉验证集用于验证模型的performance,从而对模型进行超参数调整以及确定最终模型,这些超参数包括:学习率,网络结构等 。有时也称为交叉验证集。
  • **测试集:**测试集用于对算法进行评估,不会改变学习算法和参数。

数据集划分

划分原则

  • 验证集的规模应该尽可能大,至少能够区分出你所尝试的不同算法之间的性能差异。一般来说,验证集的规模应该在 1000 - 10000 之间。
  • 测试集的规模应该大到使你能够对模型的性能进行一个高度可信的评估即可。当数据规模一般时(100-10000)时,采用数据的10%-30%来作为测试集;在数据规模很大时(10w级别),采用1%作为1%甚至更小。总的来说,只要能够很好的评估模型性能即可。
  • 验证集与测试集的规模并不是越大越好,但如果数据丰富,可以适当选择较大的验证集与测试集。

划分建议

  • 在样本量有限的情况下,有时候会把验证集和测试集合并。实际中,若划分为三类,那么训练集:验证集:测试集=6:2:2;若是两类,则训练集:验证集=7:3。
  • 在海量样本的情况下,这种情况在目前深度学习中会比较常见。此时由于数据量巨大,我们不需要将过多的数据用于验证和测试集。例如拥有1百万样本时,我们按训练集:验证集:测试集=98:1:1的比例划分,1%的验证和1%的测试集都已经拥有了1万个样本,这已足够验证模型性能了。

数据时分布

  • 训练集的分布不需要与实际数据分布一致,而应该更多的考虑如何均衡样本分布。

  • 验证集与测试集应该服从同一分布,且该分布能够很好的反应实际数据的分布。二者分布相同有助于定位问题:

    • 如果模型在验证集上表现良好,却在测试集上表现不佳,那么问题可以定位为:算法在验证集上过拟合了

    • 如果二者分布不同时,发生此情况,问题就有很多了如:

      • 算法在验证集上过拟合了。
      • 测试集比验证集更难进行预测,尽管算法做得足够好了,却很难有进一步的提升空间。
      • 测试集不一定更难预测,但它与开发集性质并不相同(分布不同)。
  • 训练集分布于验证集,测试集分布没必要一致。训练集更多的考虑模型的performance,而测试集与验证集是与真实数据相关的,更多考虑的是泛化能力。

数据不匹配问题

1 如何定位数据不匹配?

​ 数据不匹配问题是个不容易定位和解决的问题。这个问题出现总会和模型过拟合表现很相似,即在训练集上能体现非常不错的性能,但在测试集上表现总是差强人意但区别在于如果遇到是数据不匹配的问题,通常在用一批和训
练集有看相同或者相似分布的数据上仍然能取得不错的结果。但很多时候,当测试集上结果表现很差时,很多初学
者可能会直接将问题定位在模型过拟合上,最后对模型尝试各种方法后,性能却始终不能得到有效提升。当遇到这
种情况时,建议先定位出是否存在数据不匹配的问题。最简单的验证方式就是可以从训练集中挑选出一部分数据作
为验证集,重新划分后训练和验证模型表现。

2 举例常见几个数据不匹配的场景?

​ 例如设计款识别物体的app时,实际场景的图片均来自于手机拍摄,而训练集确是来自于网上各类抓取下来的图
片。例如在图像去噪、去模糊、去雾、超分辨率等图像处理场景时,由于大量数据的难以获取,因此都会采用人为
假设合成的图像进行训练,这时候应用到实际场景中也容易出现不匹配的问题

3 如何解决数据不匹配问题?

数据不匹配是个很难有固定方法来解决的问题。这里提供几条供参考的途径:
​ 1、收集更多符合实际场最需要的数据。这似乎是最简单但也最难方式
​ 2、对结果做错误分析。找出数据集中出错的数据和正确数据之间的特点和区别,这对你无论是进行后续模型的分析或者是数据的处理提供非常有效的思路。注意,这里的数据集包括训练集和测试集
​ 3、数据集增强。数据集增强并不意味看数据集越大越好,其目的是丰富数据的分布以适应更多的变化当遇到数
据不匹配时,对数据处理般可以有两种方式。其一,合成或处理更多接近需要的数据特点。其二,对所有数据包
括实际场景数据都进行处理,将所有数据都统一到另一个分布上,统一出一种新的特点。

4 如何提高深度学习系统的性能

当我们要试图提高深度学习系统的性能时,目前我们大致可以从三方面考虑:

​ 1、提高模型的结构,比如增加神经网络的层数,或者将简单的神经元单位换成复杂的 LSTM 神经元,比如在自然语言处理领域内,利用 LSTM 模型挖掘语法分析的优势。

​ 2、改进模型的初始化方式,保证早期梯度具有某些有益的性质,或者具备大量的稀疏性,或者利用线性代数原理的优势。

​ 3、选择更强大的学习算法,比如对度梯度更新的方式,也可以是采用除以先前梯度 L2 范数来更新所有参数,甚至还可以选用计算代价较大的二阶算法。


QA

1. 数据为何要 shuffle ?

shuffle 的意思是洗牌或弄乱,即打乱数据集中样本的排列顺序。这样带来一个直接的好处就是样本的分布变得均匀了。

在优化中有一个原则是:网络从意料之外的样本中学习最快,所以说,如果为了加速学习,我们要求每次喂入的数据和前一份数据相关性较低。

总的来说,shuffle的意义在于加速模型学习。

基础理论 梯度消失,梯度爆炸问题

1. 梯度消失,梯度爆炸产生原因

请看我的这篇文章: RNN 的梯度消失问题, 讲的已经很清楚了。

总的来说,梯度消失,梯度爆炸问题本质上是由于随着深度的加深,受到权重信息,激活函数的影响,连乘机制所引发的一系列问题。

2. 解决方案

解决梯度消失,梯度爆炸问题,最终的目的是解决如何在深层网络上的优化问题,当然深层网络所带来的问题远不止梯度消失,爆炸问题。

1. 采用 Relu 系激活函数

参考:激活函数

2. 合适的权重初始化

参考:权重初始化

3. 残差结构

残差的方式,能使得深层的网络梯度通过跳级连接路径直接返回到浅层部分,使得网络无论多深都能将梯度进行有效的回传。

4. Batch Normalization, Layer Normalization

参考:Normalization

5. LSTM

参考:RNN 的梯度消失问题, 讲的很清楚了。

6. 梯度裁剪 - 梯度爆炸

如果梯度超过某个阈值,就对其进行限制。

基础理论 目标函数,损失函数,代价函数

经验风险与结构风险

  • 经验风险指的是模型对数据的拟合程度,拟合程度越高,经验风险越小。(其实对应的就是代价函数)
  • 结构风险指的是对模型复杂度的评估,模型越复杂,结构风险越大。(其实对应的就是目标函数)

只考虑将经验风险最小化,会出现过拟合现象。

损失函数,代价函数,目标函数

其实在很多论文和博客中都用的很随意,其实三者之间是有着细微的区别的:

  • 损失函数(Loss Function):一般针对单个样本的描述。其用来衡量模型预测值与真实值不一致的程度,是一个非负实值函数,通常使用 表示。 损失函数越小,模型的鲁棒性就越好。

  • 代价函数(Cost Function):一般是针对总体。我们需要通过训练代价函数来获得最优参数,最常见的如平方差代价函数:

  • 目标函数(Object Function):等价于 代价函数 + 正则化项, 其往往也是我们模型中要优化求解的函数 – 目标函数。

常用的损失函数

1 . 0-1 损失函数

相等为 0 , 不相等为1。一般的在实际使用中,相等的条件过于严格,可适当放宽条件:

2. 绝对值损失函数

3. 平方损失函数

4. 对数损失函数

常见的逻辑回归使用的就是对数损失函数。逻辑回归它假设样本服从伯努利分布(0-1分布),进而求得满足该分布的似然函数,接着取对数求极值等

5. 指数损失函数

指数损失函数的标准形式为:

例如AdaBoost就是以指数损失函数为损失函数。

6. Hinge损失函数

其中 是预测值,范围为 为目标值,其为

线性支持向量机中,最优化问题可等价于

上式相似于下式

其中是Hinge损失函数,可看做为正则化项。

常用的代价函数

二次代价函数适合输出神经元是线性的情况,交叉熵代价函数适合输出神经元是S型函数的情况。

1. 二次代价函数

2. 交叉熵代价函数

  • 它是⾮负的, J > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。
  • 如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。

3. 对数似然函数代价函数

交叉熵一般与 sigmoid 结合,而对数似然代价函数一般与 softmax 结合。 对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。

QA

1. Sigmoid 为何与交叉熵搭配二不用二次方代价函数

如果使用二次方代价函数,根据权值 的偏导:

考虑到 sigmoid 函数倒数在输出接近 0 和 1 时非常小, 会导致一些样本在刚开始训练时学习的非常慢。

2. sigmoid 为何要与交叉熵搭配

交叉熵函数权值和偏置的梯度推导为:

由以上公式可知,权重学习的速度受到影响,更大的误差,就有更快的学习速度,避免了二次代价函数方程中因导致的学习缓慢的情况。

3. Logistic 回归为何要使用对数损失函数?

逻辑回归它假设样本服从伯努利分布(0-1分布),进而求得满足该分布的似然函数,接着取对数求极值等。整个过程如下:

  • Logistic 回归模型为:

  • Logistic 回归的概率分布为伯努利分布,其概率函数为:

  • 其似然函数为:

  • 对应的对数似然函数为:

将对数似然函数与上文提到的对数损失函数对比,发现,二者的本质是相同的,所以Logistic 直接采用对数损失函数。

4.为什么交叉熵损失相比均方误差损失能提高以 sigmoid 和 softmax 作为激活函数的层的性能?

简单来说,就是使用均方误差(MSE)作为损失函数时,会导致大部分情况下梯度偏小,其结果就是权重的更新很慢,且容易造成“梯度消失”现象。而交叉熵损失克服了这个缺点,当误差大的时候,权重更新就快,当误差小的时候,权重的更新才慢。

推导过程: https://blog.csdn.net/guoyunfei20/article/details/78247263

5. 损失函数有哪些? 怎么用?

  • 平方损失 – 预测问题
  • 交叉熵 – 分类问题
  • Hinge 损失 – SVM
  • CART 回归树的残差损失

Reference

[1] DeepLearning-500-questions

基础理论 维数灾难问题

引言

先思考一个问题: 数据的维度越高越好吗? 恐怕不是吧,不然为什么机器学习中特征工程如此的重要,简单来说, 当数据维度过高时,会为学习带来一些困难。

其实,任何的机器学习算法,其性能与特征数量的关系往往是这样的:

1

1. 维度再难会带来哪些问题?

  • 数据稀疏: 这很好理解, 因为维数增多,样本密度必然减少, 举例而言:假设我们现在有10个样本, 而每一维的宽度为5个单位, 这样样本密度为 ; 那么在二维空间下, 样本密度为: , 我们看到样本密度成倍数减少,最终造成了数据稀疏。

  • **样本分布不均匀:**准确的来说,处于中心位置的训练样本比边缘训练样本更加稀疏。

    这点可以通过数学定理来解释:N个点在p维单位球内随机分布,则随着p的增大,这些点会越来越远离单位球的中心,转而往外缘分散。而各点距单位球中心距离的计算公式为:

    从另一个角度来看,对于D维空间,位于半径 和半径 之间的部分占球总体积的百分比是多少?

    答案是,随着D的增加,这个比率接近为1 , 这也就解释了为什么在高维空间中,球体的大部分体积都聚集在表面附近的薄球壳上。

  • **过拟合问题:**可以肯定的一点是,样本在高维数据上更容易分类,但是,在高维中训练得到的分类器其实相当于低维空间上的一个复杂非线性分类器,而了解过拟合的同学都应该知道, 模型过于复杂往往是造成过拟合的直接原因。

2. 如何解决维数灾难问题?

  • 对于数据稀疏与分布不均的问题,只有通过增加训练样本和降维的方式来解决。
  • 对于过拟合问题,可以添加针对过拟合的一些操作来解决。

基础理论 距离度量方法

1. 欧式距离

衡量点之间的直线距离

2. 曼哈顿距离

3. 余弦距离

将两个点看做是空间中的两个向量,通过衡量两向量之间的相似性来衡量样本之间的相似性。

4. 切比雪夫距离

各对应坐标数值差的最大值。


QA

1. 余弦相似度 与 欧式距离的区别与联系

  • 区别:

    欧式距离和余弦相似度都能度量2个向量之间的相似度,但是欧式距离从2点之间的距离去考量,余弦相似从2个向量之间的夹角去考量。举例如下:

    假设 2人对三部电影的评分分别是 A = [3, 3, 3]B = [5, 5, 5]

    那么2人的欧式距离是 根号12 = 3.46, A、B的余弦相似度是1(方向完全一致)。

    从上例可以发出,2人对三部电影的评价趋势是一致的,但是欧式距离并不能反映出这一点,余弦相似则能够很好地反应。余弦相似可以很好地规避指标刻度的差异,最常见的应用是计算 文本的相似度

  • 联系:

    归一化后计算的欧式距离是关于余弦相似的单调函数,可以认为归一化后,余弦相似与欧式距离效果是一致的(欧式距离越小等价于余弦相似度越大)。

    因此可以将 求余弦相似转为求欧式距离 ,余弦相似的计算复杂度过高,转为求欧式距离后,可以借助KDTree(KNN算法用到)或者BallTree(对高维向量友好)来降低复杂度。

1.cosine

基础理论 迁移学习

基础理论 局部最小值,鞍点

基础原理

神经网络最终收敛何处?

QA


1. 如何避免陷入局部最小值与鞍点?

  • SGD 或 Mini-batch:SGD 与 Mini-batch 引入了随机性,每次以部分样本来计算梯度,能够相当程度上避免陷入局部最小值。
  • 动量: 引入动量,相当于引入惯性。一些常见情况时,如上次梯度过大,导致进入局部最小点时,下一次更新能很容易借助上次的大梯度跳出局部最小点。
  • 自适应学习率:通过学习率来控制梯度是一个很棒的思想, 自适应学习率算法能够基于历史的累计梯度去计算一个当前较优的学习率。

多任务学习

浅谈多任务学习(Multi-task Learning): https://zhuanlan.zhihu.com/p/348873723

Refernence

An Overview of Multi-Task Learning in Deep Neural Networks

对比学习

Reference

对比学习(Contrastive Learning)综述

对比学习(Contrastive Learning)相关进展梳理

损失函数

Focal loss

深度学习模型压缩 综述

https://zhuanlan.zhihu.com/p/67871864

https://zhuanlan.zhihu.com/p/36051603

https://blog.csdn.net/wspba/article/details/75671573

自监督学习

https://zhuanlan.zhihu.com/p/110278826

https://zhuanlan.zhihu.com/p/125721565

调参 优化算法

优化算法在深度学习中也是十分重要的,虽然一般情况下无脑 Adam 即可,但有时采用其余的优化算法反而能够获得更好的结果,这点很有意思。同时,理解优化算法的原理对于选择和面试还是很有帮助的。

超参数设置 – 遵循原论文

优化算法 超参数
SGD
Momentum
Adagrad
RMSprop/ Adadelta
Adam
Adamax
Nadam

三大基本算法

1. 随机梯度下降

2. 标准梯度下降

3. mini-batch 梯度下降

三者比较

  • 随机梯度下降: 每次更新的方向并不向全局最优解的方向前进,最终的收敛结果也往往在全局最优解附近,但并不能达到最优解。迭代过程不可测。不容易陷入局部最小值。
  • 标准梯度下降: 更新速度很慢,每次都要计算全部样本的梯度。且由于梯度方向过于稳定一致(没有随机因素)且更新次数过少,很容易陷入鞍点或局部最小值。
  • mini-batch 梯度下降: 二者折中,batch size 的设置是一个艺术。

梯度下降算法的一点改进

1. 动量梯度下降法

在使用梯度下降算法中,很容易产生一种“震荡现象”(相邻前后梯度正负相反),这种震荡现象减慢了梯度下降法的速度,这也导致你无法使用更大的学习率, 如果你使用较大的学习率, 可能导致震荡更大, 收敛更慢。

**Momentum的核心思想: 通过计算梯度的指数加权平均值,并利用该平均值来更新你的权重,这样梯度的变化就没有那么快了。**其本质是通过增加动量来减少随机,增加梯度的稳定性。

举个例子, 假如这里有个碗状的峡谷, 峡谷中坑坑洼洼,有许多小坡, 如果我们从峡谷上推下一个球, 根据物理现象,由于加速度,小球的速度在下降的过程中越来越快, 即使路上遇到小坡,也能够轻松跨越(跨不过去,就是局部最小点了), 直至到达谷底。

引申到动量法的参数变化中: 对于在梯度点处具有相同的方向的维度,表明加速度为正,那么速度自然加快;对于在梯度点处改变方向的维度, 加速度为负, 速度减缓。 这样,我们可以得到更快的收敛速度, 同时可以减少摇摆。

2. Nesterov Accelerated Gradient

momentum

  • 思想: 在动量法中, 小球总是以一种盲目的方式滚动, 这会造成一个问题, 在临近最优点的附近时控制不住速度,于是会造成我们在最优点附近摇啊摇,最终收敛。

    我们希望小球足够聪明,它能够预判后面的地形, 如果后面是下坡路就加速下降, 如果后面是上坡路,说明我们已经到了最优点附近, 该减速了。

  • 实现方式:Nesterov就利用这一思想,它将 假定为下一位置, 通过计算它的梯度,就可以得到我们接下来是加速还是刹车了,的确很聪明。

  • 优点:Nesterov Accelerated Gradient 相比Momentum, 能显著的提升了优化效果,收敛速度要快很多。

我们来从数学角度分析一下, 相对 momentum, 到底发生了什么变化:

具体推论需要再次参考 比Momentum更快:揭开Nesterov Accelerated Gradient的真面目

自适应学习率优化算法

0. 为何要自适应学习率?

在梯度下降的过程中,每个参数更新的频率与幅度是不同的,到了训练中后期,对于某些变量,也许已经到达了极小值附近,而有些变量仍然在初始位置不远处。 此时,如果我们采用不同的学习率会导致一个问题: 如果学习率偏小,则那些更新不多的参数会收敛的很慢,如果学习率偏大,那么对于处于极小值附近的参数,很容易产生不稳定现象。

为了解决这个问题,我们需要针对不同的参数设置不同的学习率, 但参数是无穷尽的, 不可能去人为的设置每一个参数的学习率,因此,自适应学习率就显得很有必要了。

1. Adagrad

  • 是一个对角矩阵, 上的元素表示在第 t 步更新时, 历史上 梯度的积累。
  • **思想:**对每个参数用不同的学习率,这个学习率在一开始比较大,用于快速梯度下降。随着优化过程的进行,对于已经下降很多的参数,则减缓学习率,对于还没怎么下降的参数,则保持一个较大的学习率。

  • 方法: 通过维护一个对角矩阵来累积历史梯度来实现学习率的变化, 其中对角线上的每个元素表示某个参数历史梯度的累积。

    如果某参数历史梯度较大,那么说明该参数优化的快,更有可能到达最优点附近, 而此时它在对角矩阵上对应的累积梯度也大, 从而使得对应的学习率较小,最终实现不同参数有着不同的学习率。

  • 优点: 十分适合处理稀疏数据。消除了需要手动调整学习率的问题。

  • 缺陷: 分母项的积累: 由于每个附加项都是正数,因此累积总和在训练期间不断增长。这反过来导致学习速率缩小并最终变得无限小,此时算法不再进行优化。

2. Adadelta

  • 表示 t 时刻的**平方梯度对数平均值**, 本质的思想用了对数平均的思路。
  • 改进: 改进 Adagrad 中学习率最终无限小的问题。
  • 思想: 通过设定一个窗口大小 w , 来求最近 w 个平方梯度的对数平均值(对数平均的思想),采用求平均值而非求和的方式可以有效的避免学习率无限低问题。

3. RMSprop

比较 RMSprop 与 Adadelta 二者公式可以发现,在 Adadelta 取 就是RMSprop了。

4. Adam

  • 是**历史梯度**的**对数平均估计**, 是**历史梯度平方**的**对数平均估计**,其实就是求取的 的近似。
  • 是对 的校正,可以近似为对 的无偏估计。

我们结合 Momentum 与 RMSProp 算法来看, Adam算法本质上就是将二者结合,同时考虑到梯度与梯度平方, 通过历史梯度来加速收敛, 通过历史梯度平方来修正学习率。

  • 优点: 高效的计算,收敛非常快。适合解决大规模数据和参数优化问题。

  • 为何要进行偏差修正:

    因为初始化的 为 0 向量,在通过指数平均计算均值时会偏差向 0, 尤其是在初始时间步中和 非常小的情况下(接近于1),尤其如此。

更复杂的分析,推荐: 深度学习最常用的算法:Adam优化算法

5. AdaMax

6. Nadam

如何选择优化算法?

我个人一般选择 Adam, 优点是,收敛快,这样模型迭代起来也快, 如果是轻量级模型的话, 需要好好选择优化算法调参, 而如果是重量级的模型, 无脑 Adam 是一个相当不错的选择。

QA

1. 在mini-batch 中, batch size 会带来怎样的影响?

batch size 的大小往往是由多个因素决定的:

  • 较大的批能得到更精确的梯度估计
  • 较小的批能带来更好的泛化误差,泛化误差通常在批大小为 1 时最好。但是,因为梯度估计的高方差,小批量训练时需要较小的学习率以保持稳定性,这意味着更长的训练时间
  • batch size 与所需显存息息相关,可参见:GPU 显存不足怎么办?
  • 在 GPU 上, 请采用 2 的幂数作为 batch size, 一般取值在 32 - 256。
  • 小批量更容易利用多核架构,但是太小的批并不会减少计算时间,这促使我们使用一些绝对最小批量

2. 深度学习为什么不用二阶优化?

目前深度学习中,反向传播主要是依靠一阶梯度。二阶梯度在理论和实际上都是可以应用都网络中的,但相比于一阶梯度,二阶优化会存在以下一些主要问题:

  • 计算量大,训练非常慢。
  • 二阶方法能够更快地求得更高精度的解,这在浅层模型是有益的。而在神经网络这类深层模型中对参数的精度要求不高,甚至不高的精度对模型还有益处,能够提高模型的泛化能力。
  • 稳定性:二阶方法能更快求高精度的解,同样对数据本身要的精度也会相应的变高,这就会导致稳定性上的问题。

Reference

[1] An overview of gradient descent optimization algorithms

路遥知马力——Momentum

比Momentum更快:揭开Nesterov Accelerated Gradient的真面目

调参 权重初始化

前言

本节先对一些常见的初始化方案进行描述,然后依托于 Pytorch , 论述 Pytorch 中提供的几个初始化方案,最后提出一些使用建议。

权重初始化为何如此重要?

虽然 Batch Normalization, Layer Normalization 等 Trick 大大减轻了我们需要精选权重初始化方案的需要,但对于大多数情况下, 选择合适的初始化方案依旧有利于加速我们模型的收敛。

从根本上看,选择合适的初始化方案能够使得我们的损失函数便于优化(有些优化面坑坑洼洼,有些优化面比较光滑); 从另一个角度来说, 合适的权重初始化有利于减轻梯度消失,梯度爆炸问题(参考公式推导)。

Xavier 初始化

  • 目的: 减轻梯度消失问题。

在对梯度的研究中, 发现反向梯度从输出层到输入层逐渐减小, 同时反向梯度的方差随网络反向也逐渐减小,针对这种现象,提出了Xavier initialization。

其的基本思想为:保持每一层输入的方差,反向梯度的方差一致。通过方差可以控制输入输出分布以及分布密度之间不要相差太大, 这可以使得信息在网络中能够更平滑的传播。

Kaiming 初始化

kaiming初始化的出现是因为xavier存在一个不成立的假设。xavier在推导中假设激活函数都是线性的,而在深度学习中常用的ReLu等都是非线性的激活函数。而kaiming初始化本质上是高斯分布初始化,与上述高斯分布初始化有所不同,其是个满足均值为0,方差为2/n的高斯分布:

  • n 为所在曾的输入维度

初始化方案

1. 常量初始化

  • 初始化为 0: 当我们在初始化的时候,最容易想到的就是初始化为0,但是,将W初始化为0, 那么在前向计算的时候,我们的所有神经元的输出均为相同, 然后在反向传播中, 梯度相同权重更新相同,这明显是不可行的。

    所以, 千万不要初始化为0。

1
torch.nn.init.constant_(tensor, val)

2. 随机初始化

如果我们采用随机初始化,因为我们不知道我们的参数会初始化为多少, 如果初始化不合理, 造成梯度消失的可能性是相当之大,另一方面,如果初始化在优化面坑坑洼洼的那一面,我们的优化过程将变得异常曲折,局部最小值,鞍点以及大的平坦区会造成优化的噩梦。

2. 均匀分布初始化 - U(a,b)

1
torch.nn.init.uniform_(tensor, a=0.0, b=1.0)

3. 高斯分布 - N(mean, std)

1
torch.nn.init.normal_(tensor, mean=0.0, std=1.0)

4. 单位矩阵初始化

1
torch.nn.init.eye_(tensor)

5. Xavier 初始化

  • Xavier 均匀分布

    1
    torch.nn.init.xavier_uniform_(tensor, gain=1.0)
  • Xavier 正态分布

    1
    torch.nn.init.xavier_normal_(tensor, gain=1.0)

6. Kaiming 初始化(MSRA初始化)

  • Kaiming 均匀分布

    1
    torch.nn.init.kaiming_uniform_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')
  • Kaiming 正态分布

    1
    torch.nn.init.kaiming_normal_(tensor, a=0, mode='fan_in', nonlinearity='leaky_relu')

7. 正交初始化

1
torch.nn.init.orthogonal_(tensor, gain=1)

8. 稀疏初始化

1
torch.nn.init.sparse_(tensor, sparsity, std=0.01)

QA

1. 推导一下 Xavier 的过程

单层网络

假设我们使用线性激活函数 ,那么对于一层网络来说有:

根据方差展开式有:

那么,当 时, 输出 y 的方差为:

如果 独立同分布, 也独立同分布, 那么有:

那么,我们就可以得出:

于是,为了保证方差的一致性,则应该有:

现在我们延伸到多层网络中,我们假设 是第 层激活函数的输出向量, 是第 层激活函数的输入向量。

前向传播

那么在前向传播中, 第 层的方差可以累积表达为:

反向传播

而在反向传播公式中, 损失函数对于 梯度公式为:

那么在d层网络中,第 层梯度的累计方差为:

我们的目的是,要求各层输入方差一致且各层梯度的方差也一致,这也就意味着:

那么必须有:

我们的W需要同时满足以上两个条件, 因此作为折中,有:

如果我们假设 W 服从均匀分布,则W在区间[a,b]内均匀分布的方差为:

那么带入就可以得到W的分布:

适用范围

Reference

[1] Xavier Glorot et al., Understanding the Difficult of Training Deep Feedforward Neural Networks

[2] Kaiming He et al., Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classfication

聊一聊深度学习的weight initialization

吴恩达团队:神经网络如何正确初始化?

调参 激活函数

https://zhuanlan.zhihu.com/p/352668984

前言

本文先对激活函数的特性,常见的激活函数以及如何选择合适的激活函数。

**需要注意的是,激活函数是来向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线。**可参考:激活函数,你真的懂了吗?

激活函数的性质

  • **非线性:**为模型引入非线性因素

  • **几乎处处可微:**有限的不可微点有左右导数(左右导数可能不同,如Relu)。 便于反向传播,利于优化

  • **计算简单:**激活函数在神经网络前向的计算次数与神经元的个数成正比,因此简单的非线性函数自然更适合用作激活函数。这也是ReLU之流比其它使用Exp等操作的激活函数更受欢迎的其中一个原因。

  • **非饱和性:**饱和指的是在某些区间梯度接近于零(即梯度消失),使得参数无法继续更新的问题。

  • **单调性:**当激活函数是单调的时候,单层网络能够保证是凸函数;

  • : 当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值。

    由于这个条件与非线性有点矛盾,因此激活函数基本只是部分满足这个条件,如 relu 只再 x>0 时为线性。

  • 输出值的范围有限: 当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。

    当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的 Learning Rate。

  • 参数少: 大部分激活函数都是没有参数的。

  • 归一化: 主要思想是使样本分布自动归一化到零均值、单位方差的分布,从而稳定训练。

激活函数一览

1. sigmoid

2. tanh

tanh 本质上是 sigmoid 向下平移和伸缩后的结果。

3. Relu

如何选择激活函数

  • 如果是二分类问题, 输出层是sigmoid,其余层是Relu
  • 一般隐层采用Relu, 有时也要试试 tanh, 这两大函数的变体都有必要试试

Relu 的优点

  • Relu 不耗费资源,且导数为1, 学习起来较快
  • sigmoid, tanh 的导数在正负饱和区的梯度都会接近于0, 这会造成梯度消失。
  • Relu 有Dead Relu 问题,此时试试其变体, 如Leaky Relu

激活函数的稀疏激活性

从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当 时,ReLU 硬饱和,而当 时,则不存在饱和问题。ReLU 能够在 时保持梯度不衰减,从而缓解梯度消失问题。

QA

0. Dead Relu 问题

某些神经元可能永远不会被激活, 导致其相应的参数永远不能被更新。其本质是由于Relu在的小于0时其梯度为0所导致的。

首先我们假设Relu的输入是一个低方差中心在+0.1的正态分布, 此时假设现在大多数Relu的输入是正数,那么大多数输入经过Relu函数能得到一个正值, 因此此时大多数输入能够反向传播通过Relu得到一个梯度, 于是我们的Relu的输入就完成了更新。

假设在随机反向传播中, 有一个巨大的梯度经过了Relu且此时Relu的输入为正(Relu是打开的), 那么该梯度会引起Relu输入X的巨大变化, 假设此时输入X的分布变成了一个中心在-0.1 的正态分布。此时的情况如下:

首先, 大多数Relu的输入变为负数, 输入经过Relu函数就能得到一个0, 这也意味着大多数输入不能反向传播通过Relu得到一个梯度,导致这部分输入无法通过更新。

1. Relu VS Sigmoid VS tanh

  • sigmoid 缺陷:

    • 极容易导致梯度消失问题
    • 计算费时
    • sigmoid 函数不是关于原点中心对称的
  • tanh 缺陷: 无法解决梯度消失问题

  • Relu 优点:

    • 一定程度上缓解了梯度问题: 其导数始终为一个常数
    • 计算速度非常快: 求导不涉及浮点运算,所以速度更快
    • 减缓过拟合: ReLU 在负半区的输出为 0。一旦神经元的激活值进入负半区,那么该激活值就不会产生梯度/不会被训练,造成了网络的稀疏性——稀疏激活, 这有助于减少参数的相互依赖,缓解过拟合问题的发生

2. 为什么Relu 不是全程可微也能用于基于梯度的学习?

虽然 ReLU 在 0 点不可导,但是它依然存在左导数和右导数,只是它们不相等(相等的话就可导了),于是在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误。

3. 为何加入非线性因素能够加强网络的表示能力?

  • 神经网络的万能近似定理:神经网络只要具有至少一个非线性隐藏层,那么只要给予网络足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的函数。
  • 如果不使用非线性激活函数,那么每一层输出都是上层输入的线性组合;此时无论网络有多少层,其整体也将是线性的,这会导致失去万能近似的性质
  • 但仅部分层是纯线性是可以接受的,这有助于减少网络中的参数

4. 为何 tanh 比 sigmoid 收敛快?

调参 超参数调优

https://zhuanlan.zhihu.com/p/29247151

超参数一览

1. 超参数是什么?

  • 参数: 需要训练,指的是模型训练中的权重参数和 bias 参数。
  • 超参数: 不需要训练,需要在训练前进行指定,并不断调整。

其实就很多超参数来说,调整的意义并不大,毕竟往往网络的超参数多达几十个,要是都精调的话,那岂不是得 gg, 因此往往是对重要参数精调,对次要参数粗调。

此外,很多 Trick 往往需要一些其他的超参数,对于这部分参数,往往我会遵循原论文,适当的调一调就行。毕竟,Trick 无穷尽呀。

2. 网络结构参数

网络参数指的是你自己构建网络结构时的相关参数,如卷积核数量,网络层数等

  • CNN 网络参数

    超参数 说明 推荐值
    kernel size 卷积核的 size 一般为奇数:[7 * 7], [5 * 5], [3 * 3], [1 * 1]
    kernel num 卷积核的数量 一般在 [100, 600] 间探索
  • RNN 网络参数

    超参数 说明 推荐值
  • Transformer 参数

    超参数 说明 推荐值

2. 优化参数

优化参数指的是反向传播中所涉及到的参数,主要包括:学习率, batch_size, 对应优化器参数, 损失函数参数等。

  • 常见参数
超参数 说明 推荐值
learning rate 最重要的参数,需要精调 下文有推荐
batch size 次要重要参数,需要精调 [1: 1024]
dropout 解决过拟合的重要参数,需要精调 [0: 0.5]
  • 优化器相关参数:

    优化器 参数说明 推荐值
    Adam
  • 正则化参数:

    超参 说明 推荐值
    L2 权重衰减系数 [0, 1e-4]

3. Trick 参数

超参数 说明 推荐值

几个重要的超参数

1. 学习率 – 最重要的超参数

学习率直接控制着梯度更新时的量级,从而直接影响模型的优化与最终的有效容量。 幸运的是,对于学习率的设置,已经有一套行之可效的指导方案了, 针对不同的优化器,有不同的设置区间。

如果是微调,那么学习率要降低两个数量级左右(参考 Bert 的 adam 学习率)

优化器 设置范围
SGD [1e-2 ,1e-1]
Momentum [1e-3, 1e-2]
Adagrad [1e-3, 1e-2]
Adadelta [1e-2, 1e-1]
RMSprop [1e-3, 1e-2]
Adam [1e-3, 1e-2]
Nadam [1e-3, 1e-2]

2. batch size

一般情况下, batch size 我往往会以 128 为起点,上下调整,注意,batch size 要设置为 2 的幂次方, 范围在 [1, 1024] 之间。

此外,需要一提的是 Batch Normalization 与 batch size 息息相关,如果你使用了 Batch Normalization, 那么 batch size 就不能设的太小, 这点我在 Normalization 那一节中有详细解释。

3. dropout

dropout 我往往会设置先为 0.5, 然后在 [0.0, 0.5] 范围内精调。

Dropout 往往会在卷积层和全连接层之间是有来防止过拟合。 使用 Dropout 需要注意两点:

  • 在RNN中,如果直接放在memory cell中,循环会放大噪声,扰乱学习。一般会建议放在输入和输出层;
  • 不建议dropout后直接跟上batchnorm,dropout很可能影响batchnorm计算统计量,导致方差偏移,这种情况下会使得推理阶段出现模型完全垮掉的极端情况;

4. 优化器参数

对于优化器的一些参数,我往往会采取默认值,这是因为,默认值都是论文最初的设置,一般都能够获得不错的表现,我个人一般不做很精细的调试,也不建议这样去做。

超参数调优策略

采用2的幂次方作为 batch_size 的值,并在对数尺度上对学习率进行采样。

1. 网格搜索

  • 定义一个 n 维的网格,每一格都有一个超参数。
  • 对于每个维度,定义可能的取值范围
  • 搜索所有可能的配置并获得最佳结果

我个人一般还是用 Markdown 表格来做记录, 如下:

优化算法 学习率 batch_size
adam 1e-5 128
  • **缺点:**该方法痛点真的很痛,那就是:维数灾难。 随着要精调的超参数的增加,搜索在时间复杂度上也会增加的越多(指数级别),最终使得该策略不可行。
  • 优点: 如果采用较大的搜索范围以及较小步长,该方法有很大概率能找到全局最优值

因此, 我一般尽可能少的去调节次要超参数,比如优化算法默认 Adam 等。此外, 先进行粗调来寻找全局最优值可能的位置,然后采用精调的策略寻找更精确的最优值。

一般只有超参数在 4 个以内才使用网格搜索,不然太费时间了。

2. 随机搜索

随机搜索在搜索范围内随机选取样本点,它认为如果样本点集足够大,那么通过随机采样也能大概率的找到全局最优值或其近似值。

  • 优点: 比网格搜索要快
  • 缺点:结果无法保证,很依靠调参经验。

我一般都是以推荐超参数设置方案来作为第一次的设置,然后围绕这个设置点上下浮动。

3. 贝叶斯优化

网格搜索与随机搜索都是独立于之前的训练的,

https://zhuanlan.zhihu.com/p/29779000

贝叶斯则是利用历史的搜索结果进行优化搜索。其主要有四部分组成,

  • 目标函数,大部分情况下就是模型验证集上的损失。
  • 搜索空间,即各类待搜索的超参数。
  • 优化策略,建立的概率模型和选择超参数的方式。
  • 历史的搜索结果。

首先对搜索空间进行一个先验性的假设猜想,即假设一种选择超参的方式,然后不断的优化更新概率模型,最终的目标是找到验证集上误差最小的一组超参数。

QA

1. 为何学习率那么重要?

当模型训练到一定程度后, 损失将不再减少,这个时候模型的一阶梯度接近于0,此时的Hessian 矩阵通常是两种情况:

  • 正定,即所有特征值均为正,此时通常可以得到一个局部极小值,若这个局部极小值接近全局最小则模型已经能得到不错 的性能了,但若差距很大,则模型性能还有待于提升,通常情况下后者在训练初最常见。
  • 特征值有正有负,此时模型很可能陷入了鞍点,若陷入鞍点,模型性能表现就很差。

2. 卷积核尺寸为何都是奇数?

  • 保证像素点中心位置,避免位置信息偏移
  • 填充边缘时能保证两边都能填充,原矩阵依然对称

3. 深层网络为何难以训练

  • 梯度消失, 梯度爆炸问题

4. 神经网络为何要做深?

  • 神经元数量相同的情况下,深层网络比浅层网络具有更大容量和表达空间。
  • 隐藏层增加意味着由激活函数带来的非线性变换的嵌套层数更多,就能构造更复杂的映射关系。

5. 调节 batch_size 对训练效果影响如何?

  • Batch_size 太小,模型表现效果极其糟糕(error )

6. 合理增加 batch size 有何好处?

  • 内存
  • 利用率提高了,大矩阵乘法的并行化效率提高。
  • 跑完一次 epoch 所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
  • 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

7. 盲目增大 Batch_Size 有何坏处?

  • 内存,显存容量可能撑不住
  • 跑完一次 epoch 所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。
  • Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

迁移学习

Reference

一文看懂自然语言处理中迁移学习的现状

自然语言处理(NLP)-深度学习自然语言处理

数据预处理

NLP 数据增强方法

https://zhuanlan.zhihu.com/p/75207641

https://www.qbitai.com/2020/06/16103.html

https://www.dataapplab.com/enhance-nlp-what-are-the-easiest-use-augmentation-techniques/

文本替代

  • 同义词替代:
  • 词嵌入替换: 采用嵌入空间中最近的邻接词作为句子中某些单词的替换
  • 掩码语言模型:通过bert等这种MLM模型来预测被mask掉的词来做替换,需要注意的是决定哪一个单词被mask是比较重要的

1. OOV - out of vocabulary words

  • 采用细粒度的表示 + 粗粒度的表示融合:彻底消灭所有 OOV
  • Wordpiece Model: 无法彻底解决OOV
  • <UNK>处理
  • 扩大词表

2. 数据增强

词向量

https://zhuanlan.zhihu.com/p/29364112

Word2Vec[3]

Word2Vec是Google发布的一个工具, 用于训练词向量,其提供了两种语言模型来供选择, 且Google 基于大规模语料集上训练出了预训练词向量来供开发者或研究者使用。 一般情况下,我们是没有必要自己去训练词向量的,但如果要求特殊,且语料集庞大,自己训练也是可以的。

在Word2Vec中,实现了两个模型:CBOWSkip-Gram

1. CBOW模型

CBOW,全称Continuous Bag-of-Word,中文叫做连续词袋模型:以上下文来预测当前词

img

如上图是一个两层的神经网络,其实在训练语言模型的过程中考虑到效率等问题,常常采用浅层的神经网络来训练,并取第一层的参数如上图就是 来作为最终的词向量矩阵(参考 语言模型:从n元模型到NNLM)。

CBOW模型的目的是预测 ,我们先来走一遍CBOW的前向传播过程 。

1. 前向传播过程

  • 输入层: 输入C个单词: ,并且每个 都是用 One-hot 编码表示,每一个 的维度为 V(词表长度)。

  • 输入层到隐层: 共享矩阵为 ,V表示词表长度,W的每一行表示的就是一个N维的向量(训练结束后,W的每一行就表示一个词的词向量)。在隐藏层中,我们的所有输入的词转化为对应词向量,然后取平均值,这样我们就得到了隐层输出值 ( 注意,隐层中无激活函数,也就是说这里是线性组合)。 其中,隐层输出 是一个N维的向量 。

  • 隐层到输出层:隐层的输出为N维向量 , 隐层到输出层的权重矩阵为 。然后,通过矩阵运算我们得到一个 维向量

其中,向量 的第 行表示词汇表中第 个词的可能性,然后我们的目的就是取可能性最高的那个词。因此,在最后的输出层是一个softmax 层获取分数最高的词,那么就有我们的最终输出:

2. 损失函数

我们假定 是真实单词在词汇表中的下标,那么根据极大似然法,则目标函数定义如下:

2. Skip-gram模型

Skip-Gram的基本思想是:已知当前词 的前提下,预测其上下文 ,模型如下图所示:

img

1. 前向传播过程:

  • 输入层: 输入的是一个单词,其表示形式为 One-hot ,我们将其表示为V维向量 ,其中 为词表大小。然后,通过词向量矩阵 我们得到一个N维向量

  • 隐层: 而隐层中没有激活函数,也就是说输入=输出,因此隐藏的输出也是

  • 隐层到输出层:

    • 首先,因为要输出C个单词,因此我们此时的输出有C个分布: ,且每个分布都是独立的,我们需要单独计算, 其中 表示窗口的第 个单词的分布。
    • 其次, 因为矩阵 是共享的,因此我们得到的 维向量 其实是相同的,也就是有 ,这里 的每一行同 CBOW 中一样,表示的也是评分。
    • 最后,每个分布都经过一个 softmax 层,不同于 CBOW,我们此处产生的是第 个单词的分布(共有C个单词),如下:

2. 损失函数

假设 是真实单词在词汇表中的下标,那么根据极大似然法,则目标函数定义如下:

3. 模型复杂度

本节中我们来分析一下模型训练时的复杂度,无论是在CBOW还是Skip-Gram模型中,都需要学习两个词向量矩阵:

对于矩阵 , 从前向传播中可以看到, 可以看到对于每一个样本(或mini-batch),CBOW更新 的 C 行(h与C个x相关), 而Skip-Gram 更新W中的其中一行(h与1个x相关),这点训练量并不算大。

对于 而言, 无论是 CBOW 还是 Skip-Gram 模型,每个训练样本(mini-batch)都更新 的所有 个元素。

在现实中,用于语言模型训练的数据集通常都很大,此外词表也是巨大的,这就导致对于 的更新所花费的计算成本是很大的,真的是验证了一个道理:穷逼必要搞语言模型。

为了解决优化起来速度太慢的问题, Word2Vec 中提供了两种策略来对这方面进行优化。

4. Hierarchical Softmax

HS 基于哈夫曼树将计算量大的部分转化为一种二分类问题。

hs

原先的模型中,模型再隐层之后通过 连接输出层,现在 HS 则去掉了 , 隐层向量 h 直接与上图的二叉树的 root 节点相连, 图中的每一个分支都代表一个选择。 上图中白色的叶子节点表示词表中所有的个词, 黑色节点表示非叶子节点, 每一个叶子节点(单词)都对应一条从 root 节点出发的路径,而问题就转化为了使得 这条路径的概率最大, 即: 最大。

表示从 root 到叶子节点 w 的路径上的第 j 个非叶子节点, 并且每个非叶子节点都对应一个向量, 维度与h 相同, 然后使用一个sigmod函数: ,结合向量的内积, 来判断该向左还是向右,那么第 n 个节点向左以及向右的概率分别为:

那么就有:

  • :指示函数,条件成立值为1, 反之为 -1
  • :表示整条路径的长度

这样我们就能够通过训练来更新每个非叶子节点的参数 了。举例来说,图上加黑的黑色路径: , 对于一个训练样本,我们要使得 概率最大:

且需要注意的时,再一个非叶子节点处, 向左向右的概率和为1, 因此一直分裂下去,最后的和肯定还是1, 因此可以得出:

损失函数同样为最大似然:

通过 HS, 隐层到输出层的计算量从 降到了

2. Negative Sampling – 负采样

在 Word2Vec 中, 对于输出层来说,我每一个输出节点都要预测词表中所有词在当前位置的概率,在动辄几万甚至几十万大的词表中,用softmax 计算真的十分困难。

但我们的目的不在于训练一个精准的语言模型,而只是为了训练得到语言模型的副产物-词向量,那么我们可不可以把输出压缩呢,将几万的输出压缩到几十程度,这计算量是成几何倍数的下降。

负采样的思路很简单,不直接让模型从整个词表中找最可能的词,而是直接给定这个词(正例)和几个随机采样的噪声词(负例),然后模型能够从这几个词中找到正确的词,就算达到目的了。

那么如何对负例进行采样呢?作者直接使用基于词频的权重分布来获得概率分布进行抽样:

相比于直接使用频次作为权重, 取0.75幂的好处可以减弱不同频次差异过大带来的影响,使得小频次的单词被采样的概率变大。

此时的损失函数为:

Glove []

Questions

Reference Papers

[1] Mikolov, T.(2013). Distributed Representations of Words and Phrases and their Compositionality.

[2] Mikolov, T.(2013). Efficient Estimation of Word Representations in Vector Space.

[3] Rong, X. (2014). word2vec Parameter Learning Explained.

[4] GloVe: Global Vectors for Word Representation

[5] Enriching Word Vectors with Subword Information

[6] Bag of Tricks for Efficient Text Classification

词向量与语言模型

1. 语言模型基础与词向量

语言模型可以简单理解为一个句子 s 在所有句子中出现的概率分布 P(s)。比如一个语料库中有100 个句子,『OK』这个句子出现了5次, 那么

那么,如何学习到这种概率分布呢? 最简单的方法是建立一个无比庞大的语料库,该语料库中包含了人类成百上千年间可能讲过的所有的话,那么我们不就可以算出这句话出现的概率了吗。可惜此方法不现实。

那么,能不能通过数学的方法进行表示呢?答案是可以滴,因为 S 是一个序列 ,那么可以展开为:

那么现在的问题就变成了我们如何计算

统计方法 - n元模型

回忆概率论:

我们观察上式,会发现, 比较好算, 也还ok, 就比较有难度了,随着n的增大,计算会越来越难, 几乎根本不可能估算出来。怎么办?

**马尔可夫假设:**假设任意一个词 出现的概率只同它前面的n个词 有关。由此,那么就有:

缺陷:

  1. 无法建模更远的关系,语料的不足使得无法训练更高阶的语言模型。
  2. 无法建模出词之间的相似度。
  3. 训练语料里面有些 n 元组没有出现过,其对应的条件概率就是 0,导致计算一整句话的概率为 0。解决这个问题有两种常用方法: 平滑法和回退法。

深度学习方法 - 神经网络语言模型[1]

首先,我们回到问题本身,我们为什么要计算 , 我们的目的是为了通过大规模语料库学习到语言内部的概率分布。那么有没有办法通过深度学习的方式来学习到这种概率分布呢?

观察上图,假设有一组词序列: ,其中 是所有单词的集合。我们的输入是一个词序列,而我们的输出是一个概率值,表示根据context预测出下一个词是 的概率。用数学来表示,我们最终是要训练一个模型:

  • 表示这个词序列中的第 个单词, 表示输入长度为n的词序列中的第一个单词
  • 表示从第1个单词到第 个单词组成的子序列

因此我们发现,该模型的每个样本其实计算的是:

词向量 - 表示语言的方式

前面我们通过 NNLM 可以知道,通过语言模型的训练,模型可以学习到语言的概率分布,那么如何将学习到的信息应用到下游任务呢? 这就是词向量产生的背景,如何用向量来表示语言信息,这里我们简单介绍下 Word2vec[4]。

首先明确一点的是, 词向量是语言模型的副产物。 怎么理解呢,意思是说,词向量是语言模型训练完成后产生的。

这里我们以word2vec 的 CBOW 训练模型为例:

img

通过这样训练完成后,把 保存下来,我们就得到了词向量。

2. 预训练语言模型 - 用模型表示语言

前面提到,我们的最终目的还是通过语言模型来获得某种语言的表示,但是我们看到,上面那种训练方式,似乎不太合适,那个最后 消失不见了,并且模型没有做深。

我们此处总结一下word2vec的弱点:

  • 模型无法做深,词向量的表征能力有限,词向量的抽象程度不高
  • 词向量获得的是上下文无关的,难以解决歧义问题上
  • OV 词无法解决

很有意思的是, 相差几个月的时间, ELMO ,GPT, BERT 相继诞生了,都非常具有代表性。 下面会进行分别介绍。

0. NLP 特点

在进入预训练语言模型之前,我们先来看看对于NLP来说,最重要的是什么。

首先是 NLP 的特点:

  1. 输入是一个一维线性序列

  2. 输入是不定长的,这点对于模型处理起来会比较麻烦

  3. 单词位置与句子位置的相对位置很重要,互换可能导致完全不同的意思

  4. 句子中的长距离特征对于理解语义也非常关键。

其次是,NLP 中的几大常见的任务:

  1. 序列****标注: 分词,词性标注,命名实体识别等。 特点是句子中每个单词要求模型根据上下文都要给出一个分类类别
  2. 分类任务: 文本分类, 情感分析。 特点是不管文章有多长,总体给出一个分类类别即可。
  3. 句子关系推断: QA, 自然语言推理。 特点是给定两个句子,模型判断出两个句子是否具备某种语义关系。
  4. **生成式任务:**机器翻译, 文本摘要。特点是输入文本内容后,需要自主生成另外一段文字。

最后,我们来聊聊三大基本单元: CNN,LSTM,Transformer。

首先先看简单回顾下 Transformer的self-attention 机制,该机制在预训练语言模型中起到了至关重要的作用。我们看到,对于 Transformer 来说,通过self-attention 机制,词与词之间的关系一目了然,并且不会受到文本长度的限制。 然后注意,在 Attention is all you need 这篇文章中,Transformer 是 Encoder-decoder 架构的,这与后面BERT 所用的有所不同,后面BERT 所用的只是 transformer_block。

于是我们总结一下这三个基本单元的优缺点:

RNN:

  • 优点:天生的具有时序结构,十分适合解决NLP问题
  • 缺点:
    1. 反向传播时所存在的优化困难问题, 即梯度消失,梯度爆炸问题,进而导致对超长距离依赖的解决不佳
    2. 并行能力,进而导致难以做深

CNN:

  • 优点:
    1. 可以并行,可以做的非常深
    2. 能够很好的捕捉 n-gram 特征
  • 缺点:
    1. 无法解决长距离依赖问题
    2. 对于位置信息不敏感

Transformer:

  • 优点:
    1. self-attention 天生的就解决了长距离依赖问题
    2. 可以并行,可以做的非常深
    3. 位置信息通过 position embedding 很好的补充了
  • 缺点:
    1. 对于超长文本,会导致非常大的计算复杂度
    2. 位置信息依赖于 position embedding

1. ELMO

elmo 是通过 L 层的双向LSTM语言模型来学习上下文信息的,这就解决了上文提到的前两个问题,而针对 OV词, ELMO 采用了 char-level 来生成词向量进而进行训练。而对于ELMO 的不同层而言,不同层的 LSTM 能够把握不同粒度和层级的信息,比如浅层的 LSTM 把握的是单词特征, 中层的 LSTM 把握 句法 特征,深层的 LSTM 把握语义特征。

但, ELMO 的缺点也十分明显:

  • LSTM 特征抽取能力远弱于 Transformer , 并行性差
  • 拼接方式双向融合特征融合能力偏弱
  • 层数浅,只有2层

2. BERT

语言模型:

我们先来看模型架构, BERT-base 采用12 层的 Transformer,这里简单提一下,BERT 的架构相当于 Transformer 的Encoder-decoder 架构中的Encoder。

再然后,我们看下,输入的组成部分,输入包含三个部分,分别是

  • token embedding:词向量,第一个单词是CLS标志,可以用于之后的分类任务
  • Segment Embeddings:区别两种句子,因为预训练不光做LM还要做以两个句子为输入的分类任务
  • Position Embeddings:和之前文章中的Transformer不一样,不是三角函数而是学习出来的

最后,我们看下预训练训练任务部分。

首先是 Masked LM:随机遮蔽输入 token 的15%,然后预测被遮住的 token。这样会带来一个问题,即训练与微调阶段的不一致性,因为训练阶段采用了 [MASK] 而 fine-tune 阶段并没有。为了减轻该问题, we do not always replace “masked” words with the actual [MASK] token. 具体做法如下:

假如我们有一句话, my dog is hairy , 被选中的词为hairy,数据生成器并不总是将hairy替换为[MASK],此时的过程如下:

  • 80% 情况下: 用[MASK] 替换 hairy
  • 10% 情况下: 随机选一个词如apple 来替换hairy
  • 10%: 不改变这句话

然后是 NSP,即Next Sentence Prediction,选定一个句子A,B作为预训练样本,B有50%的可能是A的下一句,也有50%的可能是语料库的随机句子。

2. GPT 1.0

其实GPT 1.0 要比 BERT 出来的早,但是吃了不会宣传的亏啊。首先来看语言模型:

跟bert 有很明显的差别,但是符合原来语言模型的的定义。

其次, 模型结构采用单向Transformer, 这是由于语言模型决定的。

第三个是, embedding 不包含 NSP 这种 segment embedding。

说到这里,我们就说完了基础的三个预训练语言模型,接下来我们探讨下如何更好的使用预训练语言模型。

3. 如何使用预训练语言模型

1. 是否要进行微调[1]

我们是直接采用训练好的向量还是用预训练语言模型进行微调呢?

『冰』表示freeze, 『火』表示微调的结果。

实际上,对于大多数的任务, BERT 进行微调的方式总是比提取向量再训练的方式能够获得更佳的效果。因此,在条件允许的情况下,推荐采用微调的方式。

2. 是否要进行再次预训练[2]

答案是需要。

我们知道现在的预训练语料采用的都是百科,书籍等比较规范的数据,而实际业务中的数据千差万别,可以这么理解,预训练本身获得的是语料库中文本的分布,而如果预训练数据分布与业务数据分布偏差较大,会带来一些负面影响。

因此,针对一些业务,如果数据与百科数据差别非常大,先进行预训练,然后再进行微调是一种比较合适的方式。

我们这里简单介绍下[2] 中的结论

  1. 在目标领域的数据集上继续预训练(DAPT)可以提升效果;目标领域与语言模型的原始预训练语料越不相关,DAPT效果则提升更明显。
  2. 在具体任务的数据集上继续预训练(TAPT)可以十分“廉价”地提升效果。
  3. 结合二者(先进行DAPT,再进行TAPT)可以进一步提升效果。
  4. 如果能获取更多的、任务相关的无标注数据继续预训练(Curated-TAPT),效果则最佳。

3. BERT 向量 vs Glove 向量

接下来我们分析下 , BERT 相对于 Glove 向量,到底强在哪里。 首先是训练数据规模的影响,

  • 随着数据规模的扩大,Glove 向量的表现与 BERT 向量的表现差距越来越小,我们看到当训练数据足够多的时候,Glove 在一些任务上能够获得略差于BERT的影响,但是在绝大多数情况下依旧比BERT 向量差很多,这说明 BERT 对于小数据集的优越性。
  • 在简单任务上,随着数据量的增加, Glove 能达到 BERT 十分接近的效果

然后是语言特征:

  • **the complexity of text structure:**句子结构的复杂性
  • Ambiguity in word usage: 单词的歧义性。
  • Prevalence of unseen words:未登录词出现的概率

上图我们可以得出以 BERT 为代表的 Contextual embeddings 在解决一些文本结构复杂度高和单词歧义性方面有显著的效果。

4. 预训练语言模型 - 后时代

首先,我们来分析一下这张图,从上往下:

  • Contextual: 谈论 静态 embedding 与 上下文 embedding,被做烂了,pass。
  • Architectures: 模型整体架构,这部分还有的探讨,可以参见上面 T5 的Model Architecture 部分。 目前业界还没有统一的标准说应该选择哪种架构,不过从 T5 的效果来看, Transformer+Encoder+Decoder 的效果是最好的,但参数量也上去了。其实就目前来看,研究的意义不是很大了,除非说能出现一个大的突破。
  • Task Types: 谈论了两件事: 语言模型的选择以及Contrastive Learning,其实这两个应该分开讨论。
  • Multi-Lingual: 从多国语言的角度出发,这方面不太懂,也不感兴趣,觉得用处不会太大。
  • Multi-Modal: 多模角度,我个人认为这对于工业界是十分有意义的。
  • Knowledge Enriched: 知识 + 预训练语言模型,我觉得这是一个很值得研究的方向,无论是在工业界和学术界。
  • Domain Specific: 特定领域 + 预训练语言模型,我觉得这方面很有搞头,毕竟很多专有领域跟公共领域还是很不同的,比如医学,生物,法学等。由于每看过相关文章,无法说上面的模型与 bert在同样语料上预训练后哪个效果好,但还是有一定参考价值的。
  • Language-Specific: 这块我觉得还是很有研究价值的,毕竟我们中文跟英文从各个方面来说差距还是蛮大的,如果能对语言有深入了解,感觉还有搞头。
  • Model Compression: 模型压缩,这个在工业界用处很大,十分建议研究,需求也很大,一些蒸馏方法所需要的资源门槛也比较低,如果有资源,有idea,建议入坑。

考虑到涉及到的内容太多,我这里抽取四个部分讨论,分别是: Architectures, Task Types, Knowledge Enriched 以及 language generation。

1. AE vs AR

AR 语言模型:自回归语言模型,指的是,依据前面(或后面)出现的 tokens 来预测当前时刻的 token, 代表有 ELMO, GPT 等。

AE 语言模型:通过上下文信息来预测被 mask 的 token, 代表有 BERT , Word2Vec(CBOW) 。

AR 语言模型:

  • **缺点:**它只能利用单向语义而不能同时利用上下文信息。 ELMO 通过双向都做AR 模型,然后进行拼接,但从结果来看,效果并不是太好。
  • 优点: 对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。

AE 语言模型:

  • 缺点: 由于训练中采用了 [MASK] 标记,导致预训练与微调阶段不一致的问题。 此外对于生成式问题, AE 模型也显得捉襟见肘,这也是目前 BERT 为数不多实现大的突破的领域。
  • 优点: 能够很好的编码上下文语义信息, 在自然语言理解相关的下游任务上表现突出。

2. GPT 系列

1. GPT 2.0

GPT 2.0 验证了数据的重要性,即使单纯的从数据角度入手,效果就可以获得巨大的提升。GPT 2.0 采用800w 互联网网页数据,这样训练出来的语言模型,能够覆盖几乎所有领域的内容。

第二个意义在于,GPT 2.0 开始探索了预训练语言模型在 zero-shot 下的表现。这方面在GPT 3.0 中体现的淋漓尽致。

  • 预训练数据与网络深度的重要性,目前也没有到极限。
  • GPT 2.0 的生成效果非常惊艳,至少语法,流畅度等方面是没有问题的,就是没有灵魂
  • zero-flot 也不是不可以

2.0 GPT 3.0

先来介绍一下几个概念:

  • FT,fine-tuning:就是微调啦
  • FS,few-shot:允许输入数条范例和一则任务说明
  • One-shot:只允许输入一条范例和一则任务说明
  • Zero-shot:不允许输入任何范例,只允许输入一则任务说明

GPT 3.0 本质上是探索超大型预训练语言模型在 few-shot,one-shot,zero-shot 上的可能性,这是延续之前 GPT 2.0 的研究,整体上,GPT 3.0 在 zero-shot 下能获得相当不错的结果。

3. BERT 系列

1. Roberta

roberta 是bert 的一个完善版,相对于模型架构之类的都没有改变,改变的只是三个方面:

  1. 预训练数据:

    • BERT采用了BOOKCORPUS 和英文维基百科, 总共16GB。而 RoBERTa采用了BOOKCORPUS + 英文维基百科+ CC-NEWS+OPENWEBTEXT+STORIES, 总共160GB。
    • Roberta 于bert 都采用 512 个token 作为序列长度,但与bert不同的是, robert 不会随机掺杂一些短句,这意味着 roberta 采用的都是长句。
  2. 动态mask vs 静态 mask:

    • **静态mask:**Bert 在准备训练数据时,每个样本只会进行一次随机mask,每个epoch都重复使用,后续的每个训练步都采用相同的mask。
    • 修改版静态mask: 在预处理时将数据集拷贝10次,每份数据采用不同的mask。
    • 动态mask:不在预处理时进行mask,而是在每次向模型输入时动态生成mask
  3. 数据格式与NSP:

    • **Segment-pair + NSP:**与bert一样。输入包含两个 segment,这两个segment可能会来自同一个文档或不同文档,两个segment 的token 数均小于 512,预训练任务包含 MLM 与 NSP。
    • **Sentence+pair + NSP:**输入包含两个 sentence,两个句子可能来自同一文档或不同文档,两个句子 token 数均少于 512。预训练任务包含 MLM 与 NSP。
    • **Full-sentences:**输入只有一部分,来自同一个文档或不同文档的连续句子,token总数不超过512。输入可能跨越文档边界,如果跨文档,则在上一个文档末尾添加文档边界token。不包含NSP任务。
    • **Doc-sentences:**输入只有一部分,输入来自同一个文档的连续句子,token总数不超过512。预训练不包含 NSP 任务。

    通过四个对比实验我们发现:

    • Segment-pair 较好于 sentence-pair,可能是因为 segment 能够学习到长距离依赖关系。
    • Doc-sentences 几乎在所有任务中表现最佳,这意味着 NSP 任务没有什么用
    • Doc-sentences 略好于 Full-sentences。

2. T5

4. 预训练语言模型与自然语言生成

这里我们先来回顾一下BERT和GPT, 前面提到, BERT 本质上相当于 Transformer 中的 Encoder, 而GPT 相当于 Transformer 中的 Decoder。既然我们已经验证了 Transformer 在文本生成领域的成功,尤其是机器翻译领域, 那么当我们想用于生成问题的时候,很自然的想到有没有办法把二者结合起来呢?

MASS 就是基于这样的思想。

1. MASS

MASS 的思想很简单, 对于输入序列 x, mask 该句从 u 到 v 位置上的token,记为 , 而对应的, 从 u 到 v 位置上的 token 片段记为 。 k = v - u + 1 表示 mask 的窗口大小 , 表示一句话中多少个 token 被 mask 。 对于 MASS 的语言模型来说, 其输入为 mask 后的序列 , 输出为被 mask 后的序列

为何 MASS 适合生成

首先, 通过 Seq2Seq 框架来预测被 mask 的tokens 使得 Encoder 去学习没有被 mask 的 token 的信息, 而Decoder 去学习如何从 Encoder 中提取有效的信息。

然后, 与预测离散的 tokens相比,Decoder 通过预测连续的 tokens, 其能够建立很好的语言生成能力。

最后, 通过输入与输出的 mask 匹配, 使得 Decoder 能够从Encoder 中提取到有意义的信息,而不是利用之前的信息。

MASS 总结来说有以下几点重新:

  • 引入了 Seq2Seq 来训练预训练模型。
  • mask 掉的是一段连续的tokens而不是离散的 mask, 有助于模型生成语言的能力。
  • Encoder 中是 mask 掉的序列,而 Decoder 中是对应被mask的 tokens。

2. UNILM

UNILM 同样想融合bert与gpt ,然而走了与 MASS 完全不同的路子,它想通过多任务学习的方式来解决。UNILM 这篇文章,厉害在同时使用多个预训练语言模型训练这个思想,在预训练任务中包含了三种语言模型:

  • Bidirectional LM BERT 的 mask LM

  • Unidirectional LM:GPT 的 语言模型,包括 left-to-right 到 right-to-left

  • Seq2Seq LM: 句子间LM。输入两个句子,第一个句子采用双向LM方式,第二个采用单向LM 方式。

3. BART

BART 与 MASS 的基本思想一致,都是受到 Transformer 在机器翻译领域的成功,尝试将 Transformer架构跟预训练结合起来。

但是与 MASS 不同的是,他们输入的数据格式有很大的差别,Decoder 也有较大的差别。与MASS 相比, BART 完全延续 Transformer 原来的架构方式。

训练数据:

  • Token Masking 和BERT一样,随机选择token用[MASK] 代替。
  • Token Deletion 随机删除token,模型必须确定哪些位置缺少输入。
  • Text Filling 屏蔽一个文段,文段长度服从泊松分布(λ=3)。每个文段被**一个[MASK]**标记替换。如果文段长度为0,意味插入一个[MASK]标记(灵感来自Span-BERT)。
  • Sentence Permutation 以句号作为分割符,将一篇文章分成多个句子,并随机打乱。
  • Document Rotation 随机均匀地选择一个token,以这个token为中心,旋转文档,选中的这个token作为新的开头,此任务训练模型以识别文档的开头。

5. 预训练语言模型融入知识

1. ERNIE

ERINE 的网络架构,语言模型等与 BERT 完全相同,与BERT 不同的主要有两点:

  • 数据的mask
  • NSP 任务 与 DLM

首先我们来看 mask 方式,ERNIE 的 mask 包括三部分:

  1. BERT 的 basic-level mask 预训练

  2. Phrase-level 预训练

  3. Entity-level 预训练

但是我们反过来看这篇文章,它融入知识了吗? 我觉得没有,对于知识图谱来说,实体本身的含义很重要,但是实体的关系同样非常重要,而这篇文章并没有融入任何的关系信息。

2. ERNIE (清华)

这篇文章最核心的点在于,将BERT的信息与TransE 的信息进行融合

我们看到,上述整个模型可以整体分为两部分:

  • T-Encoder: 与 Bert 的预训练过程完全相同,是一个多层的双向 Transformer encoder, 用来捕捉词汇和语法信息。
  • K-Encoder: 本文创新点,描述如何将知识图谱融入到预训练模型。

3. K-BERT

Reference

语言模型基础与词向量:

[1] A Neural Probabilistic Language Model

[2] Mikolov, T.(2013). Distributed Representations of Words and Phrases and their Compositionality.

[3] Mikolov, T.(2013). Efficient Estimation of Word Representations in Vector Space.

[4] Rong, X. (2014). word2vec Parameter Learning Explained.

预训练语言模型:

[1] ELMO: Deep contextualized word representations

[2] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

[3] GPT 1.0: Improving Language Understanding by Generative Pre-Training

[4] GPT 2.0: Language Models are Unsupervised Multitask Learners

[5] GPT 3.0: Language Models are Few-Shot Learners

应用预训练语言模型:

[1] To tune or not to tune? adapting pretrained representations to diverse tasks.

[2] Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks

预训练语言模型 - 后时代:

[2] ERNIE - Enhanced Language Representation with Informative Entities

[3] ERNIE - Enhanced Representation through Knowledge Integration

[4] ERNIE 2.0 - A Continual Pre-training Framework for Language Understanding

[5] MASS - Masked Sequence to Sequence Pre-training for Language Generation

[6] UNILM - Unified Language Model Pre-training for Natural Language Understanding and Generation

[7] XLNet - Generalized Autoregressive Pretraining for Language Understanding

[8] RoBERTa - A Robustly Optimized BERT Pretraining Approach

[9] TransformerXL: Attentive Language Models Beyond a Fixed-Length Context

如何预训练一个好的预训练语言模型:

[1] Pre-trained Models for Natural Language Processing: A Survey

[2] T5: Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer

1
Bag of Tricks for Efficient Text Classification

语言模型与词向量基础

1. 语言模型基础与词向量

语言模型可以简单理解为一个句子 s 在所有句子中出现的概率分布 P(s)。比如一个语料库中有100 个句子,『OK』这个句子出现了5次, 那么

那么,如何学习到这种概率分布呢? 最简单的方法是建立一个无比庞大的语料库,该语料库中包含了人类成百上千年间可能讲过的所有的话,那么我们不就可以算出这句话出现的概率了吗。可惜此方法不现实。

那么,能不能通过数学的方法进行表示呢?答案是可以滴,因为 S 是一个序列 ,那么可以展开为:

那么现在的问题就变成了我们如何计算

2. 统计方法 - n元模型

我们观察上式,会发现, 比较好算, 也还ok, 就比较有难度了,随着n的增大,计算会越来越难, 几乎根本不可能估算出来。怎么办?

马尔可夫假设:假设任意一个词 出现的概率只同它前面的n个词 有关。由此,那么就有:

缺陷:

  1. 无法建模更远的关系,语料的不足使得无法训练更高阶的语言模型。
  2. 无法建模出词之间的相似度。
  3. 训练语料里面有些 n 元组没有出现过,其对应的条件概率就是 0,导致计算一整句话的概率为 0。解决这个问题有两种常用方法: 平滑法和回退法。

3. 深度学习方法 - 神经网络语言模型[1]

首先,我们回到问题本身,我们为什么要计算 , 我们的目的是为了通过大规模语料库学习到语言内部的概率分布。那么有没有办法通过深度学习的方式来学习到这种概率分布呢?

观察上图,假设有一组词序列: ,其中 是所有单词的集合。我们的输入是一个词序列,而我们的输出是一个概率值,表示根据context预测出下一个词是 的概率。用数学来表示,我们最终是要训练一个模型:

  • 表示这个词序列中的第 个单词, 表示输入长度为n的词序列中的第一个单词
  • 表示从第1个单词到第 个单词组成的子序列

因此我们发现,该模型的每个样本其实计算的是:

Attention机制

Attention 机制 – 基础篇

Hard vs Soft [1]

Attention首先分为两大类:Hard Attention 与 Soft Attention, 两者的区别在于 Hard Attention 关注一个很小的区域,而soft Attention 关注的相对要发散。 举个机器翻译方面的例子:

我是小明 –> I am XiaoMing

  • 对于 Hard Attention而言,在第1时刻翻译时,只关注“我”这个词,我们翻译得到“I”,在第2时刻翻译时,关注“是”这个词,翻译结果为“am”,以此直到 t 时刻结束。 它是采用one-hot编码的方式对位置进行标记,比如第1时刻,编号信息就是[1,0,0…], 第二时刻,编码信息就是 [0, 1, 0, …], 以此类推。这样会带来一个缺点:无法采用常规优化方法来进行优化,具体的训练细节很复杂,不推荐深入了解。
  • 而对于soft attention 而言,在第一时刻翻译时, “我是小明” 都对 “I” 做出了贡献,只不过贡献有大小之分,也就是说,虽然“我”这个词很重要,但是我们也不能放过其他词所带来的信息。

比较二者而言,很显然,soft attention有很大的优势,因此,对于NLP领域而言,目前大多数的研究都基于 soft Attention 进行扩展。

虽然 [1] 具有很强的开创意义,但其毕竟是关于CV领域的,不推荐精读,因此我没有写任何公式,个人十分推荐下面这篇文章来作为 Attention 的第一篇精读论文。

Global vs Local [2]

在 soft attention阵营中,很快又划分为两大阵营: Glocal attentionLocal attention二者的区别在于关注的范围大小不同, 其中,Global attention 关注全部的文字序列,而 Local attention 关注的是固定的窗口中的所有文字序列

比较二者, Global attention 的计算量要比 Local Attention 要大,尤其是对于长句子而言,效率变得很低; 而 Local Attention 只与窗口内的文字相关,因此窗口的大小就显得至关重要了,且在local attention 中多了一个预测中心词 的过程,这有可能会忽略一些重要的词, 但同时,如果选择适当,那么 local attention 理应会降低无关词的干扰,当然,所带来的收益并不大。 而对于窗口的设置,论文中采用高斯分布来实现,如下:

另一方面,由于Global Attention考虑的信息较多,因此从原理上讲要更好一些,毕竟local attention 可能会忽略对当前输出很重要的词,且 Local Attention 的表现与窗口的大小密切相关,如果设置小了,可能会导致效果变得很差。

而考虑到NLP中问题的复杂性(如句子长短不一,句子之间可能有很强的相关性),因此后来的很多论文[3][4]中很少考虑采用 Local Attention 方法,且我自己在做阅读理解任务时,也基本不会考虑Local Attention, 毕竟窗口大小的设置实在太考验人了。

  • Global Attention

Global Attention

  • local attention

Local Attention

Attention的本质思想 [5] [6]

在上图中,Query 表示我们的问题信息,在阅读理解问题中,其对应的就是 question,而在机器翻译中,常常采用上一时刻的输出信息 作为 Query;

对于 { key:value }而言,大多数情况下key与value是相同的,一般指的是第 j 个词的表示, 比如在机器翻译中, key 与 value 通常采用词的隐层输出 。我们通过计算 Query 与各个 key 之间的相似性或相关性来获得 ,然后对各个进行加权求和:

由上式可以看到,对于Attention机制的整个计算过程,可以总结为以下三个过程:

  • socre 函数: 根据 Query 与 Key 计算两者之间的相似性或相关性, 即 socre 的计算。
  • **注意力权重计算:**通过一个softmax来对值进行归一化处理获得注意力权重值, 即 的计算。
  • **加权求和生成注意力值:**通过注意力权重值对value进行加权求和, 即 的计算。

总的来说,Attention 无论如何变化,总是万变不离其宗。 对于大多数 Attention 的文章来说,其变化主要在于 Query, Key, Value 的定义以及第一阶段 Score 的计算方法,下面我们来详细讨论一下。

Score 函数的选择 [6] [2]

Score 函数本质的思想就是度量两个向量的相似度。

常见的方式主要有以下三种:

  • 求点积:学习快,适合向量再同一空间中,如 Transformer 。
  • Cosine 相似性
  • MLP网络

一般情况下,采用MLP网络更加灵活一些,且可以适当的扩展层以及改变网络结构,这对于一些任务来说是很有帮助的。

Query, Key, Value 的定义

对于一个 Attention 机制而言,定义好 Query, Key, Value 是至关重要的,这一点我个人认为是一个经验工程,看的多了,自然就懂了。 我这里简单举阅读理解与机器翻译的例子:

  • 对于机器翻译而言,常见的是: Query 就是上一时刻 Decoder 的输出 , 而Key,Value 是一样的,指的是 Encoder 中每个单词的上下文表示。
  • 对于英语高考阅读理解而言, Query 可以是问题的表示,也可以是问题+选项的表示, 而对于Key, Value而言,往往也都是一样的,都指的是文章。而此时Attention的目的就是找出文章中与问题问题+选项的相关片段,以此来判断我们的问题是否为正确的选项。

由此我们可以看出, Attention 中 Query, Key, Value 的定义都是很灵活的,不同的定义可能产生不一样的化学效果,比如 Self-Attention ,下面我就好好探讨探讨这一牛逼思想。

Self-Attention [5]

Self-Attention 可以说是最火的 Attention 模型了,其在最近很火的 Bert 中也起到了重要的作用,最关键的是,其可与 LSTM 一较高低

这篇文章是十分值得精读,反复看的,因为其真正的将 Attention 用到了另一个新的高度,膜拜 Google。鉴于篇幅所限,本文就不赘述其中详细原理了,而是简述一下其核心思想。

Self-Attention 的本质就是自己注意自己, 粗暴点来说,就是,Q,K,V是一样的,即:

它的内部含义是对序列本身做 Attention,来获得序列内部的联系,如下图所示 [7]。

这其实是有点类似于我们在 Embedding 层的时候采用 LSTM 来获得输入序列的上下文表示,但与 LSTM 不同之处在于Self - Attention 更能够把握句子中词与词的句法特征或语义特征,但另一方面其对于序列的位置信息不能很好的表示,这也是为什么会采用 Postition Embedding 来对位置信息做一个补充,但对于一些对位置信息敏感的任务,position Embedding 所带来的信息可能会不够。

之所以说这篇文章具有开创意义,是因为其将Attention用到了一个基础单元上, 为取代LSTM提供了一种可能。

Reference

[1] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention – 不推荐

[2] Effective Approaches to Attention-based Neural Machine Translation

[3] Neural Machine Translation by Jointly Learning to Align and Translate

[4] Neural Responding Machine for Short-Text Conversation

[5] Attention is all you need

Refernece

Attention模型:我的注意力跟你们人类不一样

Do People and Neural Networks Pay Attention to the Same Words? Studying Eye-tracking Data for Non-factoid QA Evaluation

1
2
https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247513060&idx=1&sn=8d96a41ed097c9c4acf1b3d54af271ba&chksm=970f9b32a0781224fe7a450ed7428b9943839bacdb1874098469a4946234dfd8aea4ed8caf4b&scene=21&cur_album_id=1350016038754385921#wechat_redirect
https://mp.weixin.qq.com/s?__biz=MzIwNzc2NTk0NQ==&mid=2247503650&idx=1&sn=c2030b24daa7bf0f227379dcb639930f&scene=21#wechat_redirect

推荐先看

The Illustrated Transformer

代码: The Annotated Transformer

此外,代码十分推荐看 Bert-pytorch 里面的实现,代码比上述的要更加清晰,可以看完上述代码与 bert 之后再看。

1. Scaled Dot-product Attention

  • 首先, Q 与 K 进行了一个点积操作,这个就是我在 Attention 讲到的score操作;
  • 然后经过 Scale 操作,其实就是为了防止结果过大,除以一个尺度标度 , 其中 是 Q 中一个向量的维度;
  • 再然后, 经过一个Mask操作; 考虑到Q,K都是矩阵,且由于句子的长度是不定的,因此Q,K中必然会有一个补齐的操作,为了避免补齐的数据会影响我们Attention的计算,因此需要将补齐的数据设置为负无穷,这样经过后面的Softmax后就接近于 0,这样就不会对结果产生影响了。
  • 最后经过一个 Softmax 层, 然后计算Attention Value。

我们可以看到,这个依旧沿袭的是 Attention 的经典思想,不过在其中添加了一些操作如Scale, Mask,这意味着,对于Attention 而言, 其只要核心思想不变,适当的调整数据能够获得更好的结果。其公式如下:

这里解释一下 Scaled Dot-product Attention 在本文中的应用,也是称为 Self-Attenion 的原因所在,这里的Q,K, V 都是同源的,意思就是说,这里是句子对句子自己进行Attention来查找句子中词之间的关系,这是一件很厉害的事情,回想LSTM是怎么做的,再比较 Self-Attention, 直观的感觉,Self-Attention更能把握住词与词的语义特征,而LSTM对长依赖的句子,往往毫无办法,表征极差,这一点会单独讨论。

2. Muti-head Attention

这里多头的含义其实就是采用多个Attention来从多个维度来把握词的信息,我们从图中看到,这里有 h=8 个Attention,每个Attention输出一种 Self-Attention 的结果,然后 Concat 起来。

  • 首先,Q,K, V 进过了一个线性变换,然后再传入到 Scaled Dot-Product Attention 中, 注意一点,对于不同的 Scaled Dot-Product Attention 而言, 变换矩阵是不一样的,且这些变换矩阵都参与训练。
  • 然后,将每个 Attention 的输出 Concat。
  • 最后,进过一个线性变换输出,这个线性变化矩阵也是可训练的。

3. 残差网络,Normalization与feed-forward network

  • 首先,Encoder 与Decoder中都有着很明显的残差连接,这种残差结构能够很好的消除层数加深所带来的信息损失问题。这也是一篇很值得看的文章。
  • 其次,有一个Layer Normalization过程,这在神经网络中其实也是很常见的手段,也是很经典的一篇文章。
  • 然后,数据经过了一个前馈神经网络, 该前馈神经网络采用了两个线性变换,激活函数为Relu,公式如下:

4. Transformer 中如何使用 Multi-head Attention

Transformer 中使用 Multi-head Attention要注意以下几点:

  • 在 Encoder 与 Decoder 中的黑色框中,采用的都是是 Self-Attention ,Q,K,V 同源。
  • 需要注意的是只有在 Decoder 中的 Muti-head 中才有 Mask 操作,而在Encoder中却没有,这是因为我们在预测第 t个词时,需要将 t 时刻及以后的词遮住,只对前面的词进行 self-attention,这点不理解的话可以回想一下Sequence-to-Sequence那篇文章中对机器翻译的训练过程 。
  • 在黄色框中, Q 来自Decoder层, 而 K, V来自Encoder的输出 。

5. Positional encoding

由于 Self-Attention 自己是把握不到句子的顺序信息的,因此,Transformer 需要采用 Positional encoding 来获取序列的顺序信息,论文中采用了正余弦函数的方式。

本质上的核心思想是: 在偶数位置,使用正弦编码,在奇数位置,使用余弦编码

通过上式,我们可以得出:

6. 最后的 Linear 与 Softmax

这个其实没什么好说的,一般都会在最后一层加一个前馈神经网络来增加泛化能力,最后用一个 softmax 来进行预测。

回归到整体

前面已经将所有的细节都讲的很清楚了,这里回到整体的情况下来简要谈一下论文中的Encoder与Decoder。

  • Encoder 是由一个Stack组成, Stack中有6个相同的Layer, 每个Layer的结构如3图中所示
  • Decoder 同样由一个Stack组成, Stack中也有6个相同的Layer, 与 Encoder中的Layer有所差别, 主要是多了一个将Encoder输出引入的Muti-Head机制,这点在3图中也能很明白的看出来。

QA

1. Mask 三连问

mask 操作是什么?

mask 操作是对某些值进行掩盖,使得其再参数更新时不产生效果。

它是怎么做的?

通过将需要被mask的位置设置为负无穷,这样在后面的Softmax后,这些位置的概率就接近于 0,这样就不会对结果产生影响了。

为什么要 mask ?

Transformer 本身的 mask 操作分为两部分: padding mask 与 sequence mask。

  • Padding mask: 考虑到每个批次中输入序列的长度是不一样的,而往往我们要先进行对其,对不足长度的文本进行 padding, 而这些padding 的词其实是没有意义的, 因此我们在做 Self-attention 的时候应该忽略它。

  • Sequence Mask: 在Decoder 中,其不应该看见未来的信息,即对一个序列,当 time_step=t 时, 我们Decoder 的输出应该只依赖于 t 时刻之前的输入,而不应该依赖于 t 时刻之后的输入。

    具体的做法是,产生一个上三角矩阵,上三角的值全为 1,下三角的值权威0,对角线也是 0。

2. Scaled Dot-product Attention 中的Scaled 是啥,有啥用?

Scaled 就是缩放数据。

  • 比较大的输入会使得 softmax 的梯度变得很小,当数量级较大时, softmax 将几乎全部的概率分布都分配给了最大值对应的标签, 此时梯度消失为 0, 参数更新会变得困难。
  • 假设 Q, K 的各个分量是相互独立的随机变量,均值为 0, 方差为1,那么点积 的均值为 0, 方差为 。 方差越大,说明点积的数量级越大,通过除以 将方差稳定到 1, 可以有效的控制前面提到的梯度消失问题。

3. 为什么 Position embddding 采用正余弦函数 ?

因为有:

这样使得模型能够记住相对位置信息。

Transformer 的位置编码

QA

1. 相对位置编码和绝对位置编码区别

Reference

让研究人员绞尽脑汁的Transformer位置编码

文本分类

1. TextCNN[1]

表示一个第 个词其 维的词向量表示, 对于一个长度为 的句子,有:, 我们通过对向量矩阵 进行卷积操作来提取特征, 其中, 表示第 个词到第 个词,共 个词。

对于一个窗口大小为 的卷积核, 其 shape 为 , 其提取特征的过程为:

1个卷积核对 一次卷积的过程需要对 分别进行卷积操作, 我们得到最终的特征表示:

然后,文章对特征向量 采用最大池化操作来提取最重要特征:

上述的过程描述的是一个卷积核对 提取特征的过程,而实际中,我们往往要采用多种窗口大小的卷积核,且每种窗口的卷积核有很多个,这里假设卷积核的窗口大小为 3, 4, 5, 卷积核的shape分别为 , 其对应的卷积核数量为

对于窗口大小为 3 的卷积核, 我们在一次卷积过后获得一个的矩阵, 然后对该矩阵进行最大池化得到一个 的向量, 该向量就是窗口为3 的卷积核所提取的全部特征。

同样的道理,窗口为 4 的卷积核所提取的特征为一个 的向量, 窗口为 5 的卷积核所提取的特征为一个 的向量。

最后我们将这三个向量拼接起来形成一个 的向量, 然后将该向量送入输出层:

2. 对TextCNN 的分析 [3]

文章 [3] 对CNN 用于文本分类时的超参进行分析,这些超参包括: 词向量的选择,Filter 的大小, 卷积核的数量, 激活函数的选择, Pooling 策略, 正则化方法。

Word Embedding

文章比较了三种情况: Word2vec, Glove, Word2vec + Glove, 而实际上,三者的性能相差无几, 具体的依旧要看任务数据集,并没有定论,因此在实际的开发中,分别采用不同的预训练词向量来帮助我们更好的选择。

Filter Size

不同的数据集有其适合的 Filter Size, 文章建议区域大小为 1-10 内进行线性搜索, 但如果数据集中的句子长度较大(100+), 那么可以考虑设置较大的 Filter Size。

不同size的 Filter 进行结合会对结果产生影响,当把与最优 Filter size 相近的Filter 结合时会提升效果,但如果与较远的Filter 结合会损害性能。因此,文章建议最初采用一个 Filter , 调节 size 来找到最优的 Filter size, 然后探索最优Filter size的周围的各种 size 的组合。

卷积核数量

对于不同的数据集而言,卷积核的设置也有所不同,最好不要超过600,超过600可能会导致过拟合, 推荐范围为100-600。同时,卷积核数量增多,训练时间会变长,因此需要对训练效率做一个权衡。

激活函数

尽量多尝试激活函数, 实验表明,Relu, tanh 表现较佳。

Pooling 策略

实验分析得出, 1-max pooling 始终优于其他池化策略,这可能是因为在分类任务中,上下文的位置并不重要,且句子中的 n-granms 信息可能要比整个句子更具预测性。

正则化方法

实验表明,在输出层加上L2正则化并没有改善性能,dropout是有用的,虽然作用不明显,这可能是因为参数量很少,难以过拟合的原因所致。文章建议不要轻易的去掉正则化项,可以将 dropout 设置为一个较小值 (0-0.5),推荐0.5 , 对于L2, 使用一个相对较大的约束。 当我们增加卷积核数量时,可能会导致过拟合,此时就要考虑添加适当的正则项了。

3. TextRNN

以双向LSTM 或GRU来获取句子的信息表征, 以最后一时刻的 h 作为句子特征输入到 softmax 中进行预测, 很简单的模型,就不详细介绍了。

4. TextRCNN [4]

说实话,这篇论文写的真乱,一个很简单的思想,看起来比 Transformer 还复杂,真的是有点醉, 不推荐看原论文,写的真的很冗余。

文章的思想很简单:

  • 首先,对于单词 , 获得其词向量表示
  • 然后, 采用双向 GRU 来获取每个词的上下文向量表示
  • 为了更好的表示词的信息,文章将原始词向量 , 上下文表示 结合起来,形成词的新的向量表示,这里作者采用一个全连接网络来聚合这些信息:
  • 采用最大池化来获取句子的最终表示:

  • 最后,采用一个softmax 来做分类:

5. HAN [5]

问题定义

HAN 主要针对 document-level 的分类, 假定document 中有L个句子:, 对于句子 , 其包含有 个单词:

Word Encoder

对于一个句子 ,文章采用词向量矩阵将其做 Embedding, 然后采用双向 GRU 来获得该句子的上下文表示, 以第 个句子中的第 个单词为例:

Word Attention

考虑到在每个句子中,各个词对句子信息的贡献不同,因此此处引入一个注意力机制来提取语义信息,更好的获得句子的表示。

Sentence Encoder

一个 document 中有L个句子,我们需要对这L个句子的信息进行整合,但很明显,句子之间的信息是由关联的,因此文章采用双向GRU对句子信息进行综合来获得每个句子新的表示:

Sentence Attention

考虑到在一个document中,各个句子的重要程度并不同,因此采用一个Attention 来对句子信息进行整合最终形成 document 的最终信息:

Document Classification

DPCNN

最后

虽然文本分类是最简单的任务,但其在企业中应用最为广泛,十分适合初学者入门学习。

Reference

[1] TextCNN: Convolutional Neural Networks for Sentence Classification

[3] A Sensitivity Analysis of (and Practitioners’ Guide to) Convolutional Neural Networks for Sentence Classification

[4] Recurrent Convolutional Neural Network for Text Classification

[5] Hierarchical Attention Networks for Document Classification

[n] Large Scale Multi-label Text Classification With Deep Learning

https://mp.weixin.qq.com/s?__biz=MzAxMTk4NDkwNw==&mid=2247485854&idx=1&sn=040d51b0424bdee66f96d63d4ecfbe7e&chksm=9bb980faacce09ec069afa79c903b1e3a5c0d3679c41092e16b2fdd6949aa059883474d0c2af&token=793481651&lang=zh_CN&scene=21#wechat_redirect

Tricks - 文本分类


Reference

文本分类有哪些论文中很少提及却对性能有重要影响的tricks?

命名实体识别

命名实体识别

前言

这篇文章的目的是对命名实体识别领域进行较为全面的综述,包括数据集,评估指标,传统模型,前沿模型,发展方向,个人思考等几大块,目的是为初学者提供一个较为前沿且易懂的学习文章。本文篇幅较长,请耐心阅读,别放在收藏内吃灰哦。

NER简介

Reference

[1] A Survey on Deep Learning for Named Entity Recognition

[2] CLUENER2020: FINE-GRAINED NAMED ENTITY RECOGNITION DATASET AND BENCHMARK FOR CHINESE – 一个2020年最新的中文命名实体识别数据集

[3] LTP: A New Active Learning Strategy for Bert-CRF Based Named Entity Recognition

[4] Few-Shot Named Entity Recognition: A Comprehensive Study

[5] FLAT- Chinese NER Using Flat-Lattice Transformer

[6] Empirical Analysis of Unlabeled Entity Problem in Named Entity Recognition

[7] Lex-BERT- Enhancing BERT based NER with lexicons

上游任务 - 序列标注

前言

Reference

工业界如何解决NER问题?12个trick,与你分享

nlp中的实体关系抽取方法总结

一人之力,刷爆三路榜单!信息抽取竞赛夺冠经验分享

NER标注数据少,怎么办?

ICLR2021 中唯一录取的NER论文:NER数据存在漏标怎么办?

jayjay

流水的NLP铁打的NER:命名实体识别实践与探索

美团搜索中NER技术的探索与实践

文本匹配

上游任务 - 文本相似度

1. 孪生网络[1][2]

1. Siamese Recurrent Architectures[1]

2. Siamese Recurrent Networks [2]

Reference

[1] Siamese Recurrent Architectures for Learning Sentence Similarity

[2] Learning Text Similarity with Siamese Recurrent Networks

https://github.com/nlpyang/BertSum

https://github.com/google-research/bert/issues/164

Using Prior Knowledge to Guide BERT’s Attention in Semantic Textual Matching Tasks -2021

https://zhuanlan.zhihu.com/p/358260721

文本相似度

tags: NLP

500 questions : 18.5.6 如何做语义匹配?


[TOC]

前言

文本匹配算是一个基础性的任务,其可以应用到其他上游任务中如:信息检索,问答系统,对话等,这些上游任务本质上还是文本匹配的机制,只不过关注的核心在于,不同的任务需要不同的匹配机制。

文本匹配简介

0. 问题简介

文本匹配在信息检索,自动问答等任务有着广泛的应用,而随着文本匹配逐渐从传统的文本匹配模型向深度文本匹配模型转移,在不同任务上的应用也有很大的改变。

文本匹配问题可以简述为,一个样本中有两段文本:, 在搜索引擎中,二者分别为查询项和文档;在问答系统中,两者分别为问题和答案, 文本匹配的目的是预测二者之间的匹配程度

在实际开发中,问题往往会抽象成一个排序问题,即给定一段文本 , 然后给定另一个文本列表,其中包含多个文本段, 目标是在这个文本列表中筛选出与给定文本 匹配的文本。 文本匹配模型回计算 与 其他文本的相似度。

最关键的是,语义匹配详细可以划分为5个子任务,分别是:

  • 相似度计算
  • 问答匹配
  • 对话匹配
  • 自然语言推理
  • 信息检索中的匹配
  • 阅读理解匹配

1. 文本匹配的挑战

  • 词语匹配的多元性: 不同词可以表示同一个语义; 同一个词在不同语境下会有不同的语义。
  • 短语匹配的结构性:中文中这种词非常常见, 如:“机器学习” 与 “学习机器” 是两个不同的概念
  • 文本匹配的层次性:文本是以层次化的方式组织起来的,词语组成短语,短语组成句子,句子形成段落,段落形成篇章,在设计模型时,如何考虑不同层次的匹配信息是十分重要的。

2. 深度学习文本匹配模型[3]

根据特征提取的不同方式,深度学习在文本匹配模型中的应用大致可分为三类:

  • 基于单语义文本表达的深度学习模型: 将单个文本表达成一个稠密向量,然后计算两个向量之间的相似度来作为文本的匹配度[1] [2]。
  • 基于多语义文本表达的深度学习模型:认为单一粒度的向量来表示一段文本不够精细,需要多语义的简历表达,即分别提取词,短语,句子等不同级别的表达向量,再计算不同粒度向量间的相似度作为文本间的匹配度
  • 直接建模匹配模式的深度学习模型:认为匹配问题需要更惊喜的建模匹配的模式,即需要更早的让两段文本进行交互,然后挖掘文本交互后的模式特征,综合得到文本间的匹配度。

单粒度语义文本表达

1. DSSM,2013

2. CSDDM, 2014

ARC-I – 卷积

CNTN – 卷积

LSTM-RNN

2. 多粒度语义文本表达

MultiGranCNN

https://github.com/NTMC-Community/awesome-neural-models-for-semantic-match

https://github.com/sebastianruder/NLP-progress/blob/master/english/semantic_textual_similarity.md

MANM

Reference

[1] Siamese Recurrent Architectures for Learning Sentence Similarity

[2] Learning Text Similarity with Siamese Recurrent Networks

[3] 深度文本匹配综述

[3]

无监督文本匹配

Reference

BERT模型可以使用无监督的方法做文本相似度任务吗?

预训练语言模型

BERT 可解释性

Syntactic knowledge

Open Sesame: Getting inside BERT’s Linguistic Knowledge

Patient Knowledge Distillation for BERT Model Compression.

Linguistic Knowledge and Transferability of Contextual Representations.

Parsing as pretraining.

Are pre-trained language models aware of phrases? simple but strong baselines for grammar induction.

Inducing syntactic trees from BERT representations

Do attention heads in BERT track syntactic dependencies?

What does BERT learn about the structure of language?

A Structural Probe for Finding Syntax in Word Representations.

Emergent linguistic structure in artificial neural networks trained by self-supervision.

BERT is not a knowledge base (yet): Factual knowledge vs. name-based rea- soning in unsupervised qa

IsSuper- vised Syntactic Parsing Beneficial for Language Understanding? An Empirical Investigation.

What BERT is not: Lessons from a new suite of psy- cholinguistic diagnostics for language models

Semantic Knowledge

What BERT is not: Lessons from a new suite of psy- cholinguistic diagnostics for language models

What do you learn from context? Probing for sentence structure in contextualized word representations.

Do NLP Models Know Numbers? Probing Numeracy in Embeddings.

What’s in a Name? Are BERT Named Entity Representations just as Good for any other Name?

BERT Rediscovers the Classical NLP Pipeline.

Investigating Entity Knowledge in BERT with Simple Neural End- To-End Entity Linking

Visualizing and Measuring the Geometry of BERT

BERT Rediscovers the Classical NLP Pipeline

理解BERT每一层都学到了什么

[https://www.zhihu.com/search?type=content&q=bert%20%20%E8%81%9A%E7%B1%BB](https://www.zhihu.com/search?type=content&q=bert 聚类)

Recent Advances in Language Model Fine-tuning

Reference

Universal Language Model Fine-tuning for Text Classification

Pretrained Transformers Improve Out-of-Distribution Robustness

Neural Transfer Learning for Natural Language Processing

An Embarrassingly Simple Approach for Transfer Learning from Pretrained Language Models

Zero-Shot Entity Linking by Reading Entity Descriptions

Unsupervised Domain Adaptation of Contextualized Embeddings for Sequence Labeling

Pretraining Methods for Dialog Context Representation Learning

Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks

一文滤清预训练语言模型发展脉络

前言

预训练语言模型的诞生已经3年多了,其衍生的各个子领域可谓是百花齐放,这篇文章对我这几年看过的预训练语言模型方面的 paper 进行一个梳理,对于每个子领域有遗漏的欢迎大家评论补充。

这篇文章会以月为单位更新,拭目以待。

1. BERT 之前

1.1 从 Word Embedding 到 ELMO

Word Embedding 即词向量的诞生,其在13年就已经引起NLP领域的颠覆性发展,Word2vec 就是其典型代表。

考虑到词向量不能解决词的多义性问题,在 ELMO 之前,我们往往采用双向 LSTM 来减轻这种问题,但这毕竟治标不治本,对于大数据集好说, 深层双向 LSTM 的确能够很好的缓解这种问题,但对于小数据集,往往没啥效果。

为了解决这种多义性问题,ELMO 在训练语言模型时采用双向 LSTM 。 不同层的 LSTM 能够把握不同粒度和层级的信息,比如浅层的 LSTM 把握的是单词特征, 中层的 LSTM 把握 句法 特征, 深层的 LSTM 把握语义特征, 对于不同的任务来说, 不同的特征起到了不同的作用。

举例来说: 文本分类问题为何 ELMO 与 BERT 所起到的作用与 Word2Vec 差距并不明显,这就是因为对于文本分类这类简单问题来说, n-gram 信息起到很大的作用,而这本质就是单词特征; 但对于阅读理解领域, ELMO 与 BERT 就能大幅提高模型效果,这也是因为 语法与语义特征对于阅读理解这种深层次问题是十分重要的。

ELMO 在迁移到下游任务时,会将不同层的特征采用加权求和的方式来获得每个词的最终表示。

事实证明, ELMO 的确解决了多义性问题, 词性也能对应起来了。

但, ELMO 的缺点也十分明显:

  • LSTM 特征抽取能力远弱于 Transformer , 并行性差
  • 拼接方式双向融合特征融合能力偏弱

1.2 Fine-tuning pretraining: GPT 的诞生

GPT 虽然不是第一个预训练语言模型,但它的出现更具开创意义。其特点很明显:

  • 采用单向 Transformer 作为特征抽取器
  • 采用二阶段: 预训练 + 微调 来适配下游任务

GPT 1.0 与 GPT 2.0 的出现说明了一下几点:

  • 高质量,大规模的预训练数据集是提升性能的根本
  • 深层的 Transformer 模型具有更强的表示能力

至少,从目前为止, 业界还没有探索到数据与模型的极限,即仅仅堆数据,加深模型这条路,还没有走完。

2. 预训练新时代:BERT的诞生

GPT 虽然很强,但由于其基于 AR 模型且目前很多排行榜都是基于自然语言理解的,因此, GPT 在这方面无法与 BERT 的表现相抗衡。但 GPT 在生成方面是 BERT 无法比拟的, 就问你BERT: 会编故事吗?

BERT 主要分为两大部分: Masked LMNSP (Next Sentence Prediction)。

BERT 由于其采用 AE 模型,MASK 操作所带来的缺陷依旧存在:

  • 预训练与微调阶段不匹配的问题,这点 BERT 提供了一个策略来减轻该问题
  • Mask 掉的 token 之间关系被忽略的问题

此外,由于数据量,模型都十分大,如果每次只 mask 一个token,那么整个训练过程将变得极为漫长, 文章采用 mask 15% 的操作,是一个经验性的选择,是对模型训练效果与训练时长做出了一个权衡。

至于 NSP 任务,事实证明其在句子关系上的确起到了一定的作用,对于某些任务的确有帮助,但也有文章指出,其实用处不大,这点后面会详细讨论。

2. BERT 之后

BERT 之后,有诸多改进方案,无论是对语言模型进行改进,融合知识图谱进行改进,多任务学习+预训练语言模型等, 这些文章都具有很大的价值,且质量都很高,本节的目的是对最近的这些模型进行一个全面的总结,帮助人们理清思路。对此,我画了一个直观的优化图,如下图所示:

1. 预训练 + 知识图谱

预训练诞生之后, 在自然语言理解领域的确获得了很大的提升,尤其是在阅读理解领域,完全超过了人类的表现,虽然这并不表示真正的智能,但依旧意味着,NLP 已经逐渐走向成熟。

随之而来的问题十分明显, 如何表示知识, 有没有一种方式能够利用大规模语料+预训练语言模型使得模型能够学习到知识,从而应用到下游任务中。相信这个课题将是接下来一个十分核心的热点, 百度和清华就这方面做出了探讨, 具体可参加: Bert 改进: 如何融入知识

百度的文章中提出通过 mask 掉实体来获取实体的表示, 可以肯定的是,这样是能够更好的表示实体信息,但对于实体关系的把握,我个人觉得存疑,这是因为 mask 操作往往不仅仅 mask 掉一个实体,那么被 mask 掉的实体之间的关系如何把握?

我个人觉得可以设计一个精巧的任务来验证实体之间的关系, 可以通过知识图谱来生成一个语料, 如:

1
谢霆锋是张柏芝的__。 

我们来预测空白处的位置, 判断其是否为 丈夫前夫 之类的词, 这点需要根据具体的知识图谱而定。

清华的那篇文章,其先编码实体与实体间关系信息为一个向量, 然后将向量融合如预训练语言模型中进行训练, 而实际的操作更为复杂,俺个人觉得,这条路恐怕不是正确的路,不符合大道至简的原则,且任务太多,反而会引入噪声(个人对知识图谱研究不深,只是直观感觉)。

目前来看,个人觉得百度的路是对的。

2. 预训练 + 自然语言生成

这部分包含两个课题:

  • 如何将 BERT 用于生成任务
  • 如何设计一个适合于生成任务的语言模型

前面在 AR 与 AE 模型中已经介绍过为何 BERT 不适用于生成任务中, 那么随之而来的问题就是,既然预训练语言模型在自然语言理解中如此成功,那么我们怎么将其迁移到自然语言生成中呢, 这是一个很大的问题,个人觉得还需要1年以上的时间发展才能出现类似 Bert 这样的突破。

我个人前期看了两篇文章,大致提了一下思路:Bert 之后:预训练语言模型与自然语言生成

首先,对于第一个课题: 如何将 BERT 用于生成任务。 从技术上来说, Encoder-Decoder 架构应该是首选的框架了, Encoder 输入原句子,Decoder 生成新句子,那么问题在于,Encoder 与 Decoder 如何表示?

对于 Encoder 端来说,我们只需要将 Bert 直接初始化就行;那么对于Decoder 端呢? 也采用 Bert 初始化吗? 要知道的是, Decoder 可是用来生成的, 如果你的 embedding 信息是通过 AE 模型训练得到的,那么生成效果估计会诡异的一批。 那么现在的问题就变成了, 如何合理的初始化 Decoder 端的 embedding 信息呢?

然后,我们再来谈谈第二个课题:如何设计一个适合于生成任务的语言模型。 目前从我看到的两篇文章中有两个思路:

  • MASS 通过 mask 连续的一小段来试图即学习到理解知识,又学习到生成知识, 通过预测一段连续的 tokens 的确有助于提高模型生成方面的能力,但我个人觉得 mask 一小段信息所提升的生成能力十分有限, 且我认为这会影响到模型理解方面的能力。
  • UULM 就厉害了, 它涉及了一组语言模型: Unidirectional LM, Masked Bidirectional LM, Seq2Seq LM, 真的是有钱任性, 但这样直接堆语言模型的方式真的好吗? 可以肯定的是, 不同语言模型的结合必然是接下来的一大趋势,但你这样直接堆是不是有点暴力啊,我个人感觉一般。

那么,怎么去设计一个适合于生成任务的语言模型呢? 我个人的想法在之前的博客提到了: 就人类而言, 生成是基于理解的,而非独立的, 在大脑中, 理解与生成是两个区域, 先理解后生成,这才是正确的路。

因此,我个人觉得,接下来的一个思路应该是: 理解的归理解,不断提高预训练语言模型在理解领域的表现, 对于生成,采用 Encoder-Decoder 框架。 在预训练的角度来说, 基于理解层面训练得到的模型, 然后分别初始化 Encoder-Decoder 端, 然后去预训练 Decoder 端的参数, Freeze/not Freeze Encoder 端的参数, 从而得到词在 Encoder 与 Decoder 的不同 Embedding, 然后再生成任务中的 Encoder-Decoder 中分别使用这两种 embedding。

3. 预训练 + 多任务学习

多任务学习就更好玩了,目前主要有两大代表: MT-DNN 与 ERNIE 2.0。

  • MT-DNN 又叫联合训练,其实就是将预训练语言模型用在多个任务中去接着预训练,从而提高模型泛化。具体来说,训练过程就是把所有数据合并在一起,每个batch只有单一任务的数据,同时会带有一个task-type的标志, 然后shuffle 之后进行训练。

  • ERNIE 提出一个很好的思路: Continual Learning。 这点很有意思,就像人类做题一样, 它不像 MT-DNN 那样训练,而是这样:

    1
    task1 --> task1,task2 --> task1, task2, task3

    即在训练后续任务时,前面的任务依旧要参与训练,主要是希望在学习后续任务时依旧记得前面任务的学习成果。

我个人觉得 ERNIE 更符合我们人类的训练方式,不过具体的两种学习方式的表现还需要对比一下。

回想我们人类的学习方式,其最初是专题训练,即每个 task 分别训练, 然后再进行总体训练,即所有 task 一起进行训练,然后发现自己的弱点,然后适当加强对某任务的训练,然后又进行总体训练,如此反复, 过程更像是这样:

1
2
(task1 or task 2 or task3)--> (task1, task2), (task1, task3), (task2, task3) --> (task1, task2, task3) --> (task1 or task2 or task3) --> ...
专题训练 --> 组合训练 --> 总体训练 --> 专题训练 --> ...

如果要保证训练新任务时不会过分忘记前面训练所得到的成果,似乎各个任务的训练样本比例以及训练时间更加重要。比如你做了一年的阅读理解,突然让你做单向选择,你答的也不会太好。

因此,我个人觉得, 联合训练 + Continual Learning 是一个不错的思路。

4. 改进语言模型

要说起改进语言模型,当首推 XLNet, 毕竟前段时间也是刷了榜的,通过交换 token 位置来解决 mask 所带来的预训练与微调不匹配的问题, 这似乎比 BERT 更加优秀。

但从最近的实验看来,似乎又不是那么回事, XLNet 精巧的语言模型设计有没有超越 BERT, 目前学界还没有一个定论,RoBERTa 的出现似乎验证了在同等数据集下,XLNet 并不占优势, 通过精调模型参数,RoBERTa 获得了十分漂亮的结果。

而 XLNet 对此予以回击,又在同等条件下对比了 XLNet 与 BERT 模型, 又说明了 XLNet 效果的确要超过 BERT,emmm, 俺也不知道该相信哪个,反正我都会试试,哪个好用哪个。

XLNet 网上讲的很多了,我就不细说了。

5. 预训练 + 中文领域

十分推荐: BERT-WWM

对于中文领域,分词还是分字一直是一个问题,那么,到底是选分词,还是分字,这一直是一个大问题。

BERT 无疑选择了分字这条路, ERNIE 通过融入知识,其实带来了部分分词的效果,那么在预训练语言模型中,分词到底有没有用, BERT-WWM 给出了答案。

通过采用 mask 词的方式, 在原有的 BERT-base 模型上接着进行训练, 这其实有种 词 + 字 级别组合的方式, 我在 深度学习时代,分词真的有必要吗 中就有提到 字级别 与 词级别之间的差别, 而预训练语言模型能很好的组织二者,的确是件大喜事。

而事实证明, BERT-WWM 在中文任务上的确有着优势所在,具体就不细说了,至少目前来说,我们的中文预训练语言模型有三大选择了: BERT , ERNIE, BERT-WWM。

6. 预训练 + 精细调参

通过精细调参, BERT 能够发挥出更大的威力。 RoBERTa 证明了这一点。

此外, RoBERTa 认为 NSP 不仅不能带来下游任务的性能提升,反而会有所损害。 RoBERTa 的出现说明 BERT 本身的还有很多潜力要挖。

总的来说,这篇文章依旧是个苦工活,虽创新度一般,但价值很高。

7. 预训练+ 基础单元

大多数语言模型都采用 Transformer 来作为预训练的基本单元,那么 Transformer 有没有改进的空间呢? 必然是有的。

XLNet 采用 Transformerxl 作为基本单元来解决长文本问题,Transformerxl 本质上就是 Transformer + 循环机制, 这样会带来并行性上的损失。

相信后续还会有更多的变体来解决 Transformer 的各种问题, 如果有对 Transformer 研究十分深的同学欢迎补充一下。

最后

本来打算再多研读几篇文章再写的,但是限于精力原因(忙于秋招),只能对前段时间看的论文大致总结, 提一些自己的思路,实在是无力去找新的 Paper 了。

希望9月初会下 offer 雨打我的脸啊!!!

Reference

[1] BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

[2] ERNIE - Enhanced Language Representation with Informative Entities

[3] ERNIE - Enhanced Representation through Knowledge Integration

[4] ERNIE 2.0 - A Continual Pre-training Framework for Language Understanding

[5] MASS - Masked Sequence to Sequence Pre-training for Language Generation

[6] RoBERTa - A Robustly Optimized BERT Pretraining Approach

[7] UNILM - Unified Language Model Pre-training for Natural Language Understanding and Generation

[8] XLNet - Generalized Autoregressive Pretraining for Language Understanding

1. AR 与 AE 语言模型

AR:Autoregressive Language Modeling

AE: Autoencoding Language Modeling

  • AR 语言模型:指的是,依据前面(或后面)出现的 tokens 来预测当前时刻的 token, 代表有 ELMO, GPT 等

  • AE 语言模型:通过上下文信息来预测被 mask 的 token, 代表有 BERT , Word2Vec(CBOW)

二者有着它们各自的优缺点:

  • AR 语言模型:

    • **缺点:**它只能利用单向语义而不能同时利用上下文信息。 ELMO 通过双向都做AR 模型,然后进行拼接,但从结果来看,效果并不是太好。
    • 优点: 对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。
  • AE 语言模型:

    • 缺点: 由于训练中采用了 [MASK] 标记,导致预训练与微调阶段不一致的问题。 此外对于生成式问题, AE 模型也显得捉襟见肘,这也是目前 BERT 为数不多实现大的突破的领域。
    • 优点: 能够很好的编码上下文语义信息, 在自然语言理解相关的下游任务上表现突出。

BERT 诞生之前

NNLM, Word2vec, ELMO, GPT 1.0

GPT 系列

BERT 系列

spanBERT, Robert

多任务学习

MT-DNN

中文领域

bert-wwm

融入知识

ERNIE 系列, ERNIE-THU, LIBERT, SenseBERT, KnowBERT, BERT-MK,K-BERT,BERT-WWM,WKLM,LUKE,SemBERT,sentiLR,SKEP,KG-BERT,KEPLER

多语言

mBERT, XLM, Unicoder,XLM-R

模型压缩

ALBERT, MiniLM, DistilBERT, TinyBERT, BERT-PKD, Distilled-BiLSTM

文本生成

MASS, UNILM,bart

T5, XLNET, TransformerXL

如何使用预训练模型

0. 基础概念

  • **预训练:**指的是大公司通过大规模数据,大型网络所训练得出的模型,模型参数量往往很大

  • 训练: 指的是在预训练语言模型的基础上,再添加一些语料,接着训练语言模型,这对硬件的要求也很高,一般实验室玩不起。

  • **微调:**指的是,不针对语言模型,而是针对特定任务,对上层模型与预训练语言模型进行微调,其实本质上还是对上层模型进行微调,对预训练语言模型进行微调在数据量较小的情况下所起到的作用不大。

1. 是否要进行微调[1]

我们是直接采用训练好的向量还是用预训练语言模型进行微调呢?

『冰』表示freeze, 『火』表示微调的结果。

实际上,对于大多数的任务, BERT 进行微调的方式总是比提取向量再训练的方式能够获得更佳的效果。因此,在条件允许的情况下,推荐采用微调的方式。

2. 是否要进行再次预训练[2]

答案是需要

我们知道现在的预训练语料采用的都是百科,书籍等比较规范的数据,而实际业务中的数据千差万别,可以这么理解,预训练本身获得的是语料库中文本的分布,而如果预训练数据分布与业务数据分布偏差较大,会带来一些负面影响。

因此,针对一些业务,如果数据与百科数据(预训练)差别非常大,先进行预训练,然后再进行微调是一种比较合适的方式。

我们这里简单介绍下[2] 中的结论:

  1. 在目标领域的数据集上继续预训练(DAPT)可以提升效果;目标领域与语言模型的原始预训练语料越不相关,DAPT效果则提升更明显。
  2. 在具体任务的数据集上继续预训练(TAPT)可以十分“廉价”地提升效果。
  3. 结合二者(先进行DAPT,再进行TAPT)可以进一步提升效果。
  4. 如果能获取更多的、任务相关的无标注数据继续预训练(Curated-TAPT),效果则最佳。

3. BERT 向量 vs Glove 向量

这篇文章对比了 BERT ,Glove,random 三种向量, 我们都知道, BERT 相对于其他两种向量,其效果提升非常明显,本文基于此,探讨与传统词向量相比,BERT向量优异在何处呢?

为了对比不同词向量的在下游任务的表现,本文采用了三个任务:

  • NER: 词汇级别的任务
  • sentiment analysis:句子级别的任务
  • GLUE:句子对级别的任务

为了更加纯粹对比三种向量,三种词向量在训练时均不微调,如果微调的话,就会难以判断是模型的作用还是词向量本身的作用。

1. 数据规模

实验表明,下游任务的训练数据对于不同的向量影响是十分不同的, 结果如下图所示:

从上图中我们可以看出

  • 随着数据规模的扩大,Glove 向量的表现与 BERT 向量的表现差距越来越小,我们看到当训练数据足够多的时候,Glove 在一些任务上能够获得略差于BERT的影响,但是在绝大多数情况下依旧比BERT 向量差很多,这说明 BERT 对于小数据集的优越性。

  • 在简单任务上,随着数据量的增加, Glove 能达到 BERT 十分接近的效果

2. 语言特性

接下来, 文章从三个角度来评测不同的向量:

  • **the complexity of text structure:**句子结构的复杂性
  • Ambiguity in word usage: 单词的歧义性。
  • Prevalence of unseen words:未登录词出现的概率

从结果来看,以 BERT 为代表的 Contextual embeddings 在解决一些文本结构复杂度高和单词歧义性方面有显著的效果,但是在未登录词方面 GloVe 代表的Non-Contextual embeddings 有不错的效果。

从上面的结论可以看出,

  • 在对于拥有大量训练数据和简单任务中,考虑算力和设备等,GloVe 代表的 Non-Contextual embeddings 是个不错的选择。
  • 但是对于文本复杂度高和单词语义歧义比较大的任务,BERT代表的 Contextual embeddings 却有明显的优势。

Reference

[1] Don’t Stop Pretraining: Adapt Language Models to Domains and Tasks

[2] To tune or not to tune? adapting pretrained representations to diverse tasks.

[3] Contextual Embeddings: When Are They Worth It?

阅读理解

# 上游任务 -- 信息检索

https://www.msra.cn/zh-cn/news/features/ming-zhou-nlp-search-engine

上游任务 - 阅读理解


[TOC]

1. Attentive Reader [1]

Attentive Reader 就有点常规模型的样子了。

  • 首先,采用双向LSTM分别对 passage 与 query 进行 Embedding 来获得上下文表示;

    其中,对于 passage 而言,其获得的是一个矩阵 y,矩阵的每一列是 passage 中词的上下文表示;

    对于 query, 其将整个信息压缩为一个向量 u。

  • 其次是注意力机制的使用,这里的 Q 为 passage的表示 y, Key 为 query的表示 u, 这里的注意力机制计算公式为:

  • 最后是以 r, u 作为接下来模型 output layer 的输入来进行预测。

但可能会存在一个问题,如果 query 的长度也很长,那么压缩成一个向量,其信息的损失不得不考虑进去。

2. Standford Reader[2]

该模型是 Attentive Reader 延伸, 但在 Attention 的部分又有所不同。

  • 首先,模型通过 双向LSTM 分别对 Passage 与 Query 进行Embedding, 对于 Passage, 我们获得一个词的上下文信息矩阵:; 而对于 Query, 我们获得一个句子级别的向量表示:

  • 接下来,我们需要计算 Passage 中每个词与 Query的相关度, 然后获得最终输出到output layer 的输出表示:

  • 最后,我们将 输入到 output layer, 然后进行预测:

很明显,该模型更加干净,简洁,且获得的效果是要比 Attentive Reader 好 8-10% 个点的。 我们来简单介绍一下二者的不同:

  • 首先,在score部分计算相关度时, Attentive Reader 采用的是 tanh, 而该模型中采用的是MLP, 这样不仅仅效果更好,也更高效。
  • 其次, 在 output layer 部分,Attentive Reader 在最终预测之前,采用 tanh 将 结合起来; 而Standford Reader 仅仅采用 作为最终预测的输入, 这种用法更加高效。
  • 考虑到预测的结果是一个会出现在 Passage 中的实体,因此 Standford Reader 仅在出现的实体范围内进行预测。而 Attentive Reader 会在Passage, Question 中出现所有单词中进行预测。

3. Attention Sum Reader [3]

其实,该模型与上面的Standford Reader 很像,但加了一个小 trick。

  • 首先,采用双向 GRU 分别对 Document 与 Question 进行 Embedding; 对于Document, 我们获得了一个上下文Embedding 矩阵 ;对于 Question, 我们获得了一个 sentence-level 句子向量

  • 然后,计算 Document 中每个词与 Question 的相关度,这里采用点积的方式来做:

  • 最后,考虑到 Document 中同一个词可能会出现多次,因此这里将相同词的注意力权重相加得到该词最终的注意力权重。

  • 最后,我们从实体选项中选择 Attention weight 最高的作为答案。

但是,分析一下那个Attention Sum 操作, 其源于作者观察到答案更多偏爱出现次数较多的词,这说明,该 trick 是任务偏好的,并没有很广泛的应用价值, trick 有取巧的嫌疑。

4. Attention-over-Attention [4]

Attention-over-Attention 这篇文章质量很高,在后续的很多模型中都有使用,创新度也很高,值得精读。

  • 首先, 依旧是使用双向RNN(LSTM or GRU) 来获得 Document 与 Query 的上下文表示矩阵:

  • 然后,我们计算 Pair-wise Matching Score,其实就是计算 Document 中第 i 个词 与 Query 中的第 j 个词的相似度或相关度:

  • 再然后,进行 Individual Attentions, 其实就是对矩阵 M 的每一列做 softmax, 其中,M的一列代表的是对于 Query 中的某个词与所有 Document 中词的相关度, 那么对每一列进行 softmax 的意思就是对于给定的一个 Query 词, 对 Document 中的每个词进行 Attention,这里称之为 query-to-document attention, 公式如下:

  • 然后,进行 Attention-over-Attention, 其实就是对矩阵M的每一行做 softmax, 而 M 的一行表示的是对于 Document 中的某个词与所有 Query 中词的相关度,那么对每一行进行softmax 的意思就是对于给定的一个Document 词,对Query 中的每个词进行Attention, 这里称为 document-to-query attention, 公式如下:

    然后, 对 求和平均来得到 query-level attention , 从直观上而言,这里是获得对于整个document,每个query的Attention value:

    最后,我们将 做点乘得到 attention document-level attention:

  • 最终,Final Predictions 将相同词的score 合并,得到每个词的score, 其实就是Attention-Sum里面提出的创新部分:

本模型可以说是花式Attention的一个典型代表了,其不仅仅考虑了query到document的attention,而且考虑了document 到 query 的attention,于是称为 attention over attention。 虽然无法解释其内部的玄学,但的确该机制在很多后续的模型中都有应用,效果也不错。

5. Gated-Attention Reader [5]

  • 首先,采用双向RNN(GRU) 来获得 Document 与query的上下文表示矩阵,表示如下:

    原论文中的图好像画错了, 前不应该是 吗?不过倒是不影响理解。

  • 然后,在接下来计算中,我们要不断的迭代 D 与 X:

    其中, GA Attention 的计算公式如下:

    从直观上看,其实还是不断的融入 query 信息来获得在 document 中与 query 最相关的实体词 。与上述几个模型来比较,该模型是多层的,更能够把握这种相关语义。

    这个过程,我们迭代了K次,最终得到了

  • 在Answer Prediction 阶段,先找到空白处位置的词的表示, 然后与 做内积,再进行softmax:

  • 最后,再将相同词的概率合并:

6. BiDAF [6]

  • 首先,采用char-level 与 word-level 信息,通过 Highway Networks 融合信息来分别获得 Context 与 Query 的矩阵表示:

  • 然后,通过双向 LSTM 来获得每个词的上下文表示:

核心点: 双向注意力机制

双向注意力机制包括 Context-to-Query 与 Query-to-Context 两大部分:

  • 首先,我们先计算 H 与 U 的相似矩阵:, 对于context 中的第 个单词与 query 中的第 个单词,有:

  • **Context-to-query Attention(C2Q):**其含义是对于 Context 中的第 个单词, 我们计算 Query 中的每个单词与该词的相关度,然后进行加权求和将 Query 的信息融合入 Context。

    我们用 来表示对于单词 的这种相关度:

    然后我们通过这些相关度信息来将计算 Context 中每个词的新表示:

  • Query-to-context Attention(Q2C):其本质是计算对于 Query 中的词, Context 中的每个词与它的相关度, 然后通过加权求和将 Context 的信息融入到 Query 中。 而此段中的计算与上述有所不同:

    上式的含义是先取 S 中每一列的最大值形成一个新的向量 , 然后对这个新的向量求相关度, 其实意思对于 Query 的整体信息, Context 中每个词对其的相似度分配, 然后我们计算对于Query来说,Context 中的word信息:

    然后 重复 T 次形成 T 列, 形成 , 其实就是类似 Q2C 矩阵。 这里有一点疑问的是,为何不像上文一样计算, 是考虑到计算复杂度吗?

  • 此时,我们将这些信息综合, 其实就我看来就是将 Query 的信息融入到 Context 中,如下:

    其中, 可以选择多种方式,如多层感知机或者仅仅简单的将各个向量连接。

7. DCN [7]

1

  • 同样先通过 LSTM 来分别获得 Context 与 Query 的表示:

核心: CoAttention Encoder

8. QANet [8]

2

  • 首先,采用char-level 与 word-level 信息,通过 Highway Networks 融合信息来分别获得 Context 与 Query 的矩阵表示:

核心点: 多维信息融合

与 BIDAF 中不同, 其在信息的表示层面做了一个很精巧的融合,采用多个如下图的 Encoder Block 来获得文本的表示:

1

整个 Encoder Block 的结构是: 卷积层 + Self-Attention 层 + Feed-forward 层。 作者认为,卷积能够捕获文本的局部结构,而 Self-Attention 能够学习到全局的相互特征, 且最大的优点在于二者皆可并行。

最终得到 Context 与 query 的矩阵表示:

Context-Query Attention Layer

Reference

[1] Teaching Machines to Read and Comprehend

[2] A thorough examination of the cnn/dailymail reading comprehension task.

[3] Text understanding with the attention sum reader network

[4] Attention-over-Attention Neural Networks for Reading Comprehension

[5] Gated-attention readers for text comprehension

[6] BI-DIRECTIONAL ATTENTION FLOWFOR MACHINE COMPREHENSION

[7] Dynamic coattention networks for question answering

[8] QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION

阅读理解数据集综述

1. 阅读理解任务定义

阅读理解任务可以被当作是一个有监督学习问题,具体来说,该任务可 以详细描述为:给定一个数据集 T,其中 T 的每一个样本都以下的三元组来表示:

其中, 代表第 个样本中的文章片段, 代表第 个样本中的问题, 代表第 个样本中根据文章和问题所回答的答案。阅读理解的任务是通过学习得到一个预测函数 ,使得我们能够通过给定的 来预测出 :

通俗来讲,阅读理解任务就是通过给定一个文章片段,给定一个问题,要求计算机能够通过文章片段与问题来获得答案。

2. 阅读理解任务类型

阅读理解有多种类型,其划分的一个主要依据是根据答案的类型进行划分,这么区分的主要原因在于答案的不同使得模型输出层,损失函数,评估方式等发生很大变化。

目前来看,阅读理解任务根据具体答案形式的不同可以大致区分为以下四类:

  • 填空式阅读理解。

    填空式阅读理解有一个很明显的特点:答案往往是一个单词而非句子。填空式阅读理解任务可以描述为:给定一段文章片段与一个问题,要求机器根据文章片段与问题来推理出合理的答案, 且答案往往是文章片段的某个词。

    填空式阅读理解在阅读理解发展的早 期起到了至关重要的作用,现在已经退出主流数据集了,具体典型的数据集 有:CNN&Daily Mail,Who did What等数据集。

  • 抽取式阅读理解。

    抽取式阅读理解任务可以描述为:给定一段文章片 段,给定一个问题,要求机器根据该问题从文章片段中找出一个连续的片段作为答案。

    考虑到输出问题,此类问题又转化为预测答案的开始与结束的两 个位置 。此时,问题就转化成为一个分类问题,答案可以用篇章词片段表示为

    在过去两年中,此类数据集一直是学术界的主流数据集,极大的推动了阅读理解领域的发展,其中最典型的数据集包括 SQuAD,MS Marco,NewsQA,TriviaQA等数据集。

  • 多选式阅读理解。

    多选式阅读理解任务可以描述为:给定一段文章片段,给定一个问题,给定多个选项,要求机器根据文章片段与问题从答案选项中选择一个最合适的答案。

    通过将阅读理解问题转化为分类问题可以更准 确的评估机器对语言的理解能力,这也是此类数据集强于抽取式数据集的一 大原因。

    此类数据集是目前研究人员研究的热点之一,代表性的数据集有 RACE,CLOTH等。

  • 生成式阅读理解。

    生成式阅读理解任务可以描述为:给定一段文章片 段,给定一个问题,要求机器基于文章片段与问题生成一个合适的答案,该答案不局限于文章中存在的词语,而是自由生成的。

    此类型的阅读理解任务 更适合实际生活场景,但是由于生成的句子无法做准确评估,因此一直无法 成为业界的主流数据集。代表性的数据集有 NARRATIVEQA,CoQA等。

cloze

span

multi

free-text

3. 阅读理解任务的评估方式

任务类型 评估方法
填空式阅读理解 准确率(Accuracy)
抽取式阅读理解 EM(完全匹配值),F1
多选式阅读理解 准确率(Accuracy)
生成式阅读理解 BLEU,ROUGE

对于抽取式阅读理解任务,由于答案通常为一个片段,一般同时采用两
种评估方式:

  • 完全匹配值(Exact Match,EM)。该指标用来判定预测的答案与给 定的答案是否完全相同,即预测的开始位置 与终止位置 是否与真实值相同,其计算公式下:

  • F1 值。该指标主要评估预测的答案片段与正确答案的重合率,其计 算公式如下所示:

4. 现有数据集分类

本节汇集了当前大多数的阅读理解数据集,并对其进行简单描述

1. 填空式阅读理解

考虑到这部分其实已经几乎没人在搞了,因此就不做详细描述了。

数据集 语言 状态
MCTest [1] English 过时,不推荐研究
CNN/Daily Mail[2] English 过时,不推荐研究
CBT[3] English 过时,不推荐研究
Quasar-S[4] English 过时,不推荐研究
  • CNN&Daily Mail: 最具代表的数据聚集,数据来源于CNN 和 Daily Mail。
  • CBT:数据来源于儿童读物。

2. 抽取式阅读理解

https://www.leiphone.com/news/201903/QcmBwrYSo8QyWXRb.html

数据集 语言 状态
SQuAD 1.0 [5] English 过时
SQuAD 2.0 [6] English 热点
DuReader Chinese 热点
MS MARCO English 非研究热点,但跟搜索引擎紧密结合
CoQA [9] English 热点,接替SQuAD
TriviaQA [10] English 热点
HotpotQA [11] English 热点
Quasar-T [4] English 非研究热点
SearchQA[12] English 非研究热点
CMRC 2018 Chinese 研究热点
CMRC 2019 Chinese 热点
NewsQA [13] English 有点意思
QuAC [14] English 非热点
  • SQuAD 1.0:来源于维基百科,给定 context 于 question, 从 context 中截取一个片段,该片段作为答案。 是一个典型的抽取式问题。

  • SQuAD 2.0:在 SQuAD 1.0 的基础上新增超过5万无法回答的问题。这要求模型不仅要在能够在问题可回答时给出答案,还要判断哪些问题是阅读文本中没有材料支持的,并拒绝回答这些问题。

  • DuReader: 中文阅读理解数据集,应该是国内最棒的阅读理解数据集。它的格式跟 下面的 MS MARCO 相似。DuReader中的问题和文档均来自百度搜索和百度知道。答案是人为产生的,而不是原始上下文中的片段。DuReader之所以与众不同,是因为它提供了新的问题类型,例如yes、no和opinion。与事实性问题相比,这些问题有时需要对文档的多个部分进行汇总。

  • MS MARCO:, 很工业化的数据集,来自Bing 用户查询,因此跟搜索引擎技术紧密相连,十分适合学习。为了克服以前的数据集的弱点,它具有四个主要功能。

    首先,所有问题都是从真实用户查询中收集的;

    其次,对于每个问题,使用Bing搜索引擎搜索10个相关文档作为上下文;

    第三,人为这些问题标注了答案,因此它们不仅限于上下文范围,还需要更多的推理和总结;

    最后,每个问题有多个答案,有时甚至冲突,这使得机器选择正确的答案更具挑战性。MS MARCO使MRC数据集更接近真实世界。

  • CoQA:, 对话式阅读理解数据集,这跟现实生活又近了一步,是现在研究的热点。CoQA包含约8000轮对话,问题的答案有五种类型,分别为Yes、No、Unknown,文章中的一个span和生成式答案。当根据文章和之前的对话信息无法回答当前问题时,答案为Unknown。该数据集不仅提供答案,而且给出了答案的依据,每一种类型的答案的依据都是文章中的一个span。

  • TriviaQA:。该数据集构造问答对,然后从维基百科等页面中寻找对应的论据。最终通过上述方式构造了约65,000个“问题-答案-论据”三元组,通过这种方式构造的数据集比SQuAD更接近实际使用场景。对比SQuAD数据集,其主要集中于是推理方面的问题,并且实验证明一些在SQuAD上表现良好的模型在TriviaQA上并不能获得理想的结果。

  • HotpotQA:研究基于多个信息内容的多步推理,然后回答问题。这意味着答案并不仅仅来源于单一文档。

  • Quasar-T:不建议深入研究。

  • SearchQA:作者构建该数据集的目的是构建能反映检索系统噪声的阅读理解数据集,作者通爬取 Jeopardy 上的问题,然后将问题作为query 在Google 上检索,获得 answer snippets。 该数据集是通过程序生成的,因此噪声不可避免的比较高,因此不建议深入研究。

  • NewsQA:该数据集是从CNN新闻网站上构造的,构造方法与SQuAD一致。

  • QuAC: 对话式阅读理解数据集。

3. 多选式阅读理解

数据集 语言 状态
RACE [15] English 热点,可研究
CLOTH [16] English 一般,已解决
ARC [17] English 一般,不推荐
Who did What [18] English 过时,不推荐研究
OpenBookQA [19] English 一般,不推荐
CommonsenseQA [20] English 一般,不推荐
COSMOS QA [21] English 一般
  • RACE: RACE 取自于中国中高考阅读理解题型,我个人认为这是目前最能体现阅读理解能力的数据集之一,十分值得研究。
  • CLOTH:来自中文中高考完形填空题型,相较于RACE, CLOTH 天然的适合 BERT 这种 AE 模型来填词,因此 CLOTH 可以说是已经被解决了,准确率比人高。
  • ARC:ARC 取自中学生考试中的科学问题,并进一步分为ARC-Challenge 于 ARC-Easy 两个子集,共包含大约8000个问题,此外,该数据集中提供与该任务相关的包含14M科学事实的语料库用来回答这些问题。
  • OpenBookQA:包含大约6000个问题,每个问题包括四个选项,此外,与ARC数据集相似,该数据集也提供了参考语料库,包含1326个事实,每个问题期望结合语料库中的某一个事实来得到答案。此外,还需要结合一些常识知识。如何准确的利用参考语料库与常识知识成为了该数据集的主要问题之一。
  • CommonsenseQA:来自于ConceptNet,其包含大约12000个需要结合背景知识的问题。在该数据集中,标注者根据ConceptNet中的实体概念来自由构造问题,来使问题包含人类所具有的、但难以在网络资源中检索到的背景知识,故回答问题需要利用问题、候选答案,以及仅仅使用检索策略无法检索到的背景知识。
  • COSMOS QA:包含35600个需要常识阅读理解的问题,其专注于解决需要跨越上下文、而不是定位指定片段的推理问题。

4. 生成式阅读理解

生成式阅读理解目前还没有热起来的趋势,相关的数据集也没有进入主流视野,个人不建议做这方面的研究。 这一大原因在于文本生成作为单一的任务迟迟得不到突破,至少目前为止(2020年),看不到突破的影子,个人觉得还需要一些时间。

5. 其他

其他还有一些数据集,如bAbi,LAMBADA, SCT,MCScript,NarrativeQA,DuoRC,CliCR,WikiQA 等,水平有限,累了,就不做赘述了。

最后

本文总结了大多数的数据集,但是并没有对数据集进行详细描述,一来是因为工作量比较大,二来是觉得没有必要。 一般做阅读理解紧跟几个主流数据集就行,太多数据集反而会乱了自身阵脚。

Reference

1. 博客参考

赛尔笔记 | 机器阅读理解简述

RCPapers

2. 填空式阅读理解

[1] (MCTest) MCTest: A Challenge Dataset for the Open-Domain Machine Comprehension of Text. Matthew Richardson, Christopher J.C. Burges, and Erin Renshaw. EMNLP 2013. paper.

[2] (CNN/Daily Mail) Teaching Machines to Read and Comprehend. Hermann, Karl Moritz, Tomas Kocisky, Edward Grefenstette, Lasse Espeholt, Will Kay, Mustafa Suleyman, and Phil Blunsom. NIPS 2015. paper

[3] (CBT) The Goldilocks Principle: Reading Children’s Books with Explicit Memory Representations. Felix Hill, Antoine Bordes, Sumit Chopra, and Jason Weston. arXiv preprint arXiv:1511.02301 (2015). paper

[4] (Quasar) Quasar: Datasets for Question Answering by Search and Reading. Bhuwan Dhingra, Kathryn Mazaitis, and William W. Cohen. arXiv preprint arXiv:1707.03904 (2017). paper

3. 抽取式阅读理解

[5 ] (SQuAD 1.0) SQuAD: 100,000+ Questions for Machine Comprehension of Text. Pranav Rajpurkar, Jian Zhang, Konstantin Lopyrev, and Percy Liang. EMNLP 2016. paper

[6] (SQuAD 2.0) Know What You Don’t Know: Unanswerable Questions for SQuAD. Pranav Rajpurkar, Robin Jia, and Percy Liang. ACL 2018. paper

[7] (DuReader) DuReader: a Chinese Machine Reading Comprehension Dataset from Real-world Applications. Wei He, Kai Liu, Yajuan Lyu, Shiqi Zhao, Xinyan Xiao, Yuan Liu, Yizhong Wang, Hua Wu, Qiaoqiao She, Xuan Liu, Tian Wu, and Haifeng Wang. ACL 2018 Workshop. paper

[8] (MS MARCO) MS MARCO: A Human Generated MAchine Reading COmprehension Dataset. Tri Nguyen, Mir Rosenberg, Xia Song, Jianfeng Gao, Saurabh Tiwary, Rangan Majumder, and Li Deng. arXiv preprint arXiv:1611.09268 (2016). paper

[9] (CoQA) CoQA: A Conversational Question Answering Challenge. Siva Reddy, Danqi Chen, and Christopher D. Manning. arXiv preprint arXiv:1808.07042 (2018). paper

[10] (TriviaQA) TriviaQA: A Large Scale Distantly Supervised Challenge Dataset for Reading Comprehension. Mandar Joshi, Eunsol Choi, Daniel S. Weld, Luke Zettlemoyer. arXiv preprint arXiv:1705.03551 (2017). paper

[11] (HotpotQA) HotpotQA: A Dataset for Diverse, Explainable Multi-hop Question Answering. Yang Z , Qi P , Zhang S , et al. . 2018.paper

[12] (SearchQA) SearchQA: A New Q&A Dataset Augmented with Context from a Search Engine. Matthew Dunn, Levent Sagun, Mike Higgins, V. Ugur Guney, Volkan Cirik, and Kyunghyun Cho. arXiv preprint arXiv:1704.05179 (2017). paper

[13] (NewsQA) NewsQA: A Machine Comprehension Dataset. Adam Trischler, Tong Wang, Xingdi Yuan, Justin Harris, Alessandro Sordoni, Philip Bachman, and Kaheer Suleman. arXiv preprint arXiv:1611.09830 (2016). paper

[14] (QuAC) QuAC : Question Answering in Context. Eunsol Choi, He He, Mohit Iyyer, Mark Yatskar, Wen-tau Yih, Yejin Choi, Percy Liang, and Luke Zettlemoyer. arXiv preprint arXiv:1808.07036 (2018). paper

3. 多选式阅读理解

[15] (RACE) RACE: Large-scale ReAding Comprehension Dataset From Examinations. Guokun Lai, Qizhe Xie, Hanxiao Liu, Yiming Yang, and Eduard Hovy. EMNLP 2017. paper

[16] (CLOTH) Large-scale Cloze Test Dataset Created by Teachers. Qizhe Xie, Guokun Lai, Zihang Dai, and Eduard Hovy. EMNLP 2018. paper

[17] (ARC) Think you have Solved Question Answering?Try ARC, the AI2 Reasoning Challenge. Peter Clark, Isaac Cowhey, Oren Etzioni, Tushar Khot,Ashish Sabharwal, Carissa Schoenick, and Oyvind Tafjord. arXiv preprint arXiv:1803.05457 (2018). paper

[18] (Who did What) Who did What: A Large-Scale Person-Centered Cloze Dataset Takeshi Onishi, Hai Wang, Mohit Bansal, Kevin Gimpel, and David McAllester. EMNLP 2016. paper

[19] (OpenBookQA) Mihaylov T, Clark P, Khot T, et al. Can a suit of armor conduct electricity? a new dataset for open book question answering[J]. 2018. paper

[20] Talmor A, Herzig J, Lourie N, et al. Commonsenseqa: A question answering challenge targeting commonsense knowledge[J]. 2018. paper

[21] Huang L, Bras R L, Bhagavatula C, et al. Cosmos QA: Machine reading comprehension with contextual commonsense reasoning[J]. arXiv, 2019. paper

其他

[22] (bAbi) Towards AI-Complete Question Answering: A Set of Prerequisite Toy Tasks. Jason Weston, Antoine Bordes, Sumit Chopra, Alexander M. Rush, Bart van Merriënboer, Armand Joulin, and Tomas Mikolov. arXiv preprint arXiv:1502.05698 (2015). paper

[23] (LAMBADA) The LAMBADA Dataset:Word Prediction Requiring a Broad Discourse Context. Denis Paperno, Germ ́an Kruszewski, Angeliki Lazaridou, Quan Ngoc Pham, Raffaella Bernardi, Sandro Pezzelle, Marco Baroni, Gemma Boleda, and Raquel Fern ́andez. ACL 2016. paper

[24] (SCT) LSDSem 2017 Shared Task: The Story Cloze Test. Nasrin Mostafazadeh, Michael Roth, Annie Louis,Nathanael Chambers, and James F. Allen. ACL 2017 workshop. paper

[25] (MCScript) MCScript: A Novel Dataset for Assessing Machine Comprehension Using Script Knowledge. Simon Ostermann, Ashutosh Modi, Michael Roth, Stefan Thater, and Manfred Pinkal. arXiv preprint arXiv:1803.05223. paper

[26] (NarrativeQA) The NarrativeQA Reading Comprehension Challenge.
Tomáš Kočiský, Jonathan Schwarz, Phil Blunsom, Chris Dyer, Karl Moritz Hermann, Gábor Melis, and Edward Grefenstette. TACL 2018. paper

[27] (DuoRC) DuoRC: Towards Complex Language Understanding with Paraphrased Reading Comprehension. Amrita Saha, Rahul Aralikatte, Mitesh M. Khapra, and Karthik Sankaranarayanan. ACL 2018. paper

[28] (CliCR) CliCR: a Dataset of Clinical Case Reports for Machine Reading Comprehension. Simon Suster and Walter Daelemans. NAACL 2018. paper

自然语言推理

上游任务 - 自然语言推理

关系抽取

上游任务 - 关系抽取


https://zhuanlan.zhihu.com/p/77868938

先抽取实体,再判断关系

R-BERT: https://blog.csdn.net/xiaowopiaoling/article/details/105679350, Enriching Pre-trained Language Model with Entity Information for Relation Classification

联合抽取

TPLinker: https://github.com/131250208/TPlinker-joint-extraction, TPLinker: Single-stage Joint Extraction of Entities and Relations Through Token Pair Linking, https://blog.csdn.net/li_jiaoyang/article/details/111315300

https://github.com/weizhepei/CasRel, A Novel Cascade Binary Tagging Framework for Relational Triple Extraction, https://zhuanlan.zhihu.com/p/143591841

实体链接

实体链接

Refernece

Facebook提出生成式实体链接、文档检索,大幅刷新SOTA!

文本摘要

抽取式摘要

https://zhuanlan.zhihu.com/p/79223454

Fine-tune BERT for Extractive Summarization

https://github.com/nlpyang/BertSum

文本生成

文本生成的最新进展

https://zhuanlan.zhihu.com/p/104383357

https://www.jiqizhixin.com/articles/2020-04-14

https://zhuanlan.zhihu.com/p/334374764

关键词抽取

BERT-KPE - Joint Keyphrase Chunking and Salience Ranking with BERT

Methodology

  • a chunking network: 识别出有意义的n-grams, 直接采用全连接接网络+softmax判断该n-gram 是否为合适的chunk
  • a ranking network:为 phrase 评分

KeyPhrase Extraction

SKE: Span Keyphrase Extraction

Reference

[1] Keyphrase Extraction with Span-based Feature Representations

NP chunking

https://superangevil.wordpress.com/2009/11/20/nltk7_2/

SIFRank: A New Baseline for Unsupervised Keyphrase Extraction Based on Pre-trained Language Model

Abstract

Model Overview

Overall Structure

  • 首先先分词,并标注词性
  • 采用 NP-chunker(用正则编写) 提取句子中的 NPs
  • 用预训练语言模型获取每个 token 的表示
  • 分别将document 与 NPs 表示成向量
  • 计算NPs embedding 与 document的 cos距离, 选择topk

SIF

通过SIF 来分别获得 NPs 与 document 的 embedding 。

引入了两个平滑项,来解释(1)有些词是在上下文之外出现(2)某些高频词如『the』是没有语境限制的:

  • 是标量, 是整个语料库中单词 的词频。

SIFRank

  • document d 的embedding 为
  • 候选NP的embedding 为

SIF:a simple but tough to beat baseline for sentence embeddings

https://zhuanlan.zhihu.com/p/44534561

https://zhuanlan.zhihu.com/p/111710604

https://blog.csdn.net/qq_42491242/article/details/105381771

核心思想:

  • 词频加权: 对组成句子的词进行线性加权,其中每个词的权重为 ,其中 是词频, 是超参数。
  • **语义无关向量去除:**句子向量的生成要去除文本中与语义无关的向量。具体做法是从数据集中抽样一些句子,然后计算这些句子向量对应的最大的奇异值向量,这样的向量被认为代表了文本中的语法或停用词这些和语义无关的内容。将这些向量去除可以增强文本对语义本身的表达能力。

模型解释

在潜变量生成模型(latent variable generative model)中,语料的生成是一个动态过程,也就是说每个时刻生成一个单词。这个动态过程是由一个话语向量 (discourse vector)的随机游走来控制的。这里的话语向量代表着当前句子正在表达的意思(what is being talked about)代表着句子的状态或者一种潜在的语义信息。而单词的词向量 的内积则表示了单词和句子的联系。

两个问题:

  • 有些在单词上下文之外的词对句向量也是有影响的
  • 有些频繁出现的高频词(和,的,and,the等)是对话语本身没有贡献的

开放域对话

开放域对话

tags: NLP


https://zhuanlan.zhihu.com/p/360572095

https://zhuanlan.zhihu.com/p/75009749

https://mp.weixin.qq.com/s/_QY2EhB-TiBcb5q0379McQ

https://zhuanlan.zhihu.com/p/360575335

Reference

2021年了,对话系统凉透了吗?

一文带你入门知识图谱多跳问答

多模态命名实体识别

Reference

RpBERT: A Text-image Relation Propagation-based BERT Model for Multimodal NER 2021-2

模型压缩

知识蒸馏

Reference

[1] https://zhuanlan.zhihu.com/p/161930307

[2] knowledge Distillation: A survey

模型压缩 - 综述

Reference

[1] A Survey of Methods for Model Compression in NLP

[2] A Survey of Model Compression and Acceleration for Deep Neural Networks

[3] A Survey of Methods for Low-Power Deep Leaning and Computer Vision

[4] Recent Advances in Efficient Computation of Deep Convolutional Neural Networks

中英文分词

Subword ,你值得拥有


前言

在进入预训练语言模型时代,Subword方法就已经开始大行其道了,虽然目前在英文领域应用广泛,但似乎还没有在中文领域中出现很重量级的 Subword 方法,我个人觉得可以适当探讨一下。因此,我就把最近看过的所有的预训练语言模型中所用的 Subword 方法提取出来,分析了一波,感兴趣的可以看看。

目前来看,方法大致可以分为三种,分别是 BPE[2],WordPiece[1][4],以及SentencePiece[3]。本文先对这三大算法进行论述,然后谈谈中文方向的分词方法发展,最后,在Github上维护一个实现仓库来帮助各位更好的理解。

BPE [2]

中文分词 - BERT-wwm

其实,早在之前就有写文章谈到我个人对于中文分词的看法:深度学习时代,分词真的有必要吗,最近看Subword方法时,又想到中文分词的问题,于是我提了一个小问题:预训练语言模型时代,还需要做分词吗?,希望各位大佬能够分享看法。

BERT-wwm其实从另一个角度阐述了分词的问题,其实其与百度的那篇ERNIE差不多,都是通过 mask 词而非字来实现的。具体的是,如果词中的某个字被mask掉,那么该词需要被完全mask。且相同的是,BERT-wwm与ERNIE都是在BERT已训练好的基础上进行再训练的,其实本质上是词的粒度信息与字的粒度信息的融合,而这似乎是一种很不错的方式。 而这结果再次验证了:不同粒度的信息对于预训练语言模型的提升是有用的。

从 Mask 这种操作来看,分词似乎已经完全没有必要了,当然,如果你想去训练一个中文预训练语言模型的话,那么词粒度的信息似乎是要被考虑进去的。

Reference

[1] BERT,RoBERTa,UNILM:Google’s Neural Machine Translation System:Bridging the Gap Between Human and Machine Translation

[2] GPT 1.0,GPT 2,.0,MASS,XLMs:Neural machine translation of rare words with subword units.

[3] XLNet,ALBERT:Sentencepiece: A simple and language independent subword tokenizer and detokenizer for neural text processing.

[4] Subword regularization: Improving neural network translation models with multiple subword candidates.

[5] BERT-WWM:Pre-Training with Whole Word Masking for Chinese BERT

分词

1. 英文分词

  • BPE
  • WordPiece

2. 中文分词

3. 中英文混杂

任务型对话

领域分类与意图识别

Reference

[1] BERT for joint intent clasification and slot filing

[2] A multi-task hierarchical approach for intent detection and slot filing

对话管理

Reference

[1] SUMBT: Slot-uterance matching for universal and scalable belief tracking

综述

核心挑战:

  1. 如何准确理解和识别在复杂业务场景下基于自然语言的用户意图
  2. 如何解决对训练数据的标注依赖和知识库的结合问题
  3. 如何解决多模态条件下对话内容的个性化生成

管道方法

包括5个部分:

  • 自动语音识别
  • 自然语言理解
  • 对话管理:对话状态跟踪和对话策略
  • 自然语言生成
  • 语音合成

1. 自然语言理解

自然语言理解的目的是将用户的输入映射到预先根据不同场景定义的语义槽位中,包括三个任务:

  • 领域识别: 分类任务
  • 意图识别: 分类任务
  • 语义槽位填充: 序列标注任务

主要挑战:

  • 模型的领域扩展问题:当用户目标发生变化或话题切换时,NLU将现有的模型快速准确移植到其他领域是非常困难的。
  • 缺少语料问题:半监督方法,迁移学习,无监督学习
  • 复杂任务下结合知识进行逻辑推理能力:基于常识的知识图谱
  • 用户对话自由度高,不能总是输入精确的指令,口语句式参差多变,没有明确,准确的句式

发展趋势:

  • SQUAD 2.0 数据集, CoQA 数据集
  • 结合上下文进行推断, 对特定领域问题融合外部知识和常识解决
  • 采用预训练语言模型
  • 多任务学习,迁移学习

2. 对话管理

对话管理控制着整个对话系统的流程。任务主要有:对话状态跟踪和生成对话策略。

对话状态跟踪 - DST

  • 基于规则的方法: 有限状态机, N-best 列表
  • 基于生成式模型方法:贝叶斯网络,部分可观测马尔可夫模型
  • 基于判别式模型,当做分类任务:RNN, LSTM

对话策略 - DPO

3. 自然语言生成

  • 基于规则模板/句子规划的方法:人工设定对话场景,根据每个对话场景设计对话模板
  • 基于语言模型的方法:
  • 基于深度学习的方法

端到端方法

系统评估方法

  • 自然语言理解: 分类问题,准确率,召回率和 F-score
  • 对话状态跟踪:假设准确率,平均排序倒数,L2范数,平均概率,ROC表现,等误差率和正确接受率
  • 对话策略:任务完成率,平均对话轮数
  • 自然语言生成: